![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
搜索算法
新名字的故事
这个作者很懒,什么都没留下…
展开
-
547. 省份数量
题目描述:有 n 个城市,其中一些彼此相连,另一些没有相连。如果城市 a 与城市 b 直接相连,且城市 b 与城市 c 直接相连,那么城市 a 与城市 c 间接相连。省份 是一组直接或间接相连的城市,组内不含其他没有相连的城市。给你一个 n x n 的矩阵 isConnected ,其中 isConnected[i][j] = 1 表示第 i 个城市和第 j 个城市直接相连,而 isConnected[i][j] = 0 表示二者不直接相连。返回矩阵中 省份 的数量。解题思路一:DFSclass原创 2021-01-07 10:27:57 · 116 阅读 · 0 评论 -
310. 最小高度树
题目描述:树是一个无向图,其中任何两个顶点只通过一条路径连接。 换句话说,一个任何没有简单环路的连通图都是一棵树。给你一棵包含 n 个节点的数,标记为 0 到 n - 1 。给定数字 n 和一个有 n - 1 条无向边的 edges 列表(每一个边都是一对标签),其中 edges[i] = [ai, bi] 表示树中节点 ai 和 bi 之间存在一条无向边。可选择树中任何一个节点作为根。当选择节点 x 作为根节点时,设结果树的高度为 h 。在所有可能的树中,具有最小高度的树(即,min(h))被称为原创 2020-12-28 22:15:59 · 115 阅读 · 0 评论 -
37. 解数独
题目描述:编写一个程序,通过填充空格来解决数独问题。一个数独的解法需遵循如下规则:数字 1-9 在每一行只能出现一次。数字 1-9 在每一列只能出现一次。数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。空白格用 ‘.’ 表示。解题思路:思路和N皇后问题是一样的,只是在找到正确答案之后就要停止递归和回溯,此外每个3*3的block的访问下标需要正确计算,代码如下:class Solution: def solveSudoku(self, board: List[List[原创 2020-12-28 20:08:45 · 62 阅读 · 0 评论 -
40. 组合总和 II
题目描述:给定一个数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。candidates 中的每个数字在每个组合中只能使用一次。说明:所有数字(包括目标数)都是正整数。解集不能包含重复的组合。解题思路:依然是回溯,需要考虑重复元素,而且组合问题的话,就是一旦考虑了,之后就不需要考虑,所以不像排列那样需要交换,直接考虑剩下的元素就可以了,代码如下:class Solution: def combinationS原创 2020-12-28 15:32:47 · 60 阅读 · 0 评论 -
47. 全排列 II
题目描述:给定一个可包含重复数字的序列 nums ,按任意顺序 返回所有不重复的全排列。解题思路:和全排列一样的用dfs+回溯,只是因为可能有重复的元素,因此在进行选择是否进行当前次迭代,通过看当前值是否已经在前面遍历中出现过了,不能直接和上一个比较,因为在进行交换之后数组已经无序了,代码如下:class Solution: def permuteUnique(self, nums: List[int]) -> List[List[int]]: # nums.sort()原创 2020-12-26 12:07:14 · 66 阅读 · 0 评论 -
2020-12-24
题目描述:给定一个二叉树,返回所有从根节点到叶子节点的路径。说明: 叶子节点是指没有子节点的节点。解题思路:dfs+回溯# Definition for a binary tree node.# class TreeNode:# def __init__(self, x):# self.val = x# self.left = None# self.right = Noneclass Solution: def binary原创 2020-12-24 11:49:17 · 93 阅读 · 0 评论 -
130. 被围绕的区域
题目描述:给定一个二维的矩阵,包含 ‘X’ 和 ‘O’(字母 O)。找到所有被 ‘X’ 围绕的区域,并将这些区域里所有的 ‘O’ 用 ‘X’ 填充。被围绕的区间不会存在于边界上,换句话说,任何边界上的 ‘O’ 都不会被填充为 ‘X’。 任何不在边界上,或不与边界上的 ‘O’ 相连的 ‘O’ 最终都会被填充为 ‘X’。如果两个元素在水平或垂直方向相邻,则称它们是“相连”的。解题思路:根据解释得到了思路,可以先从矩阵的四条边用dfs遍历可以到达的"O",这些"O"都是没法被"X"包围的,将他们打上标记,然原创 2020-12-23 22:06:50 · 67 阅读 · 0 评论 -
2020-12-23
题目描述:给定两个单词(beginWord 和 endWord)和一个字典 wordList,找出所有从 beginWord 到 endWord 的最短转换序列。转换需遵循如下规则:每次转换只能改变一个字母。转换后得到的单词必须是字典中的单词。说明:如果不存在这样的转换序列,返回一个空列表。所有单词具有相同的长度。所有单词只由小写字母组成。字典中不存在重复的单词。你可以假设 beginWord 和 endWord 是非空的,且二者不相同。解题思路一:先利用字典里的单词以及开始和结尾单词构建原创 2020-12-23 20:43:16 · 70 阅读 · 0 评论 -
2020-12-23
题目描述:在给定的二维二进制数组 A 中,存在两座岛。(岛是由四面相连的 1 形成的一个最大组。)现在,我们可以将 0 变为 1,以使两座岛连接起来,变成一座岛。返回必须翻转的 0 的最小数目。(可以保证答案至少是 1。)解题思路:先用dfs找到一个岛屿以及离它最近的一圈为0的边缘点,将他们的值改为2,表示已经访问过了,然后将边缘点都添加到队列中,再依次遍历队列中的所有点,利用bfs,一层一层遍历找到离另一个岛屿最近的一条路径,遇到1就可以直接返回结果,遇到2直接跳过,遇到0依旧将点添加到队列中,代码原创 2020-12-23 16:54:07 · 115 阅读 · 0 评论 -
2020-12-23
题目描述:n 皇后问题研究的是如何将 n 个皇后放置在 n×n 的棋盘上,并且使皇后彼此之间不能相互攻击。给定一个整数 n,返回所有不同的 n 皇后问题的解决方案。每一种解法包含一个明确的 n 皇后问题的棋子放置方案,该方案中 ‘Q’ 和 ‘.’ 分别代表了皇后和空位。解题思路:和矩阵中找字符串的思路是一样的,同样是回溯法加修改访问状态,这是这里的访问状态需要考虑行、列以及左右对角线,因为是n*n的棋盘,然后放的是n个皇后,所以每一行每一列都只能有一个皇后,因此我们用遍历行的方式,这样就不用记录行的访原创 2020-12-23 11:45:54 · 57 阅读 · 0 评论 -
2020-12-23
题目描述:给定一个二维网格和一个单词,找出该单词是否存在于网格中。单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格。同一个单元格内的字母不允许被重复使用。解题思路:同样也是回溯,只不过这里回溯的方法是采样修改访问标记的方法,而不是修改输出的方法,代码如下:class Solution: def exist(self, board: List[List[str]], word: str) -> bool: n, m =原创 2020-12-23 11:07:53 · 62 阅读 · 0 评论 -
77. 组合
题目描述:给定两个整数 n 和 k,返回 1 … n 中所有可能的 k 个数的组合。解题思路:也是利用回溯的方法,只是组合这里回溯的是是否把当前元素加入结果中,代码如下:class Solution: def combine(self, n: int, k: int) -> List[List[int]]: comb = [0] * k res = [] def traceback(i, index): if inde原创 2020-12-23 10:22:39 · 64 阅读 · 0 评论 -
2020-12-22
题目描述:给定一个 没有重复 数字的序列,返回其所有可能的全排列。解题思路:回溯法,就是dfs+加上回改当前子节点状态,一次考虑每一位是可以任意一个数,选定一个数之后马上考虑下一位数,这就是dfs,只是Python需要注意,将nums添加到结果当中时,需要进行拷贝,不然返回的数组全是一样的结果,代码如下:class Solution: def permute(self, nums: List[int]) -> List[List[int]]: res = []原创 2020-12-22 17:30:12 · 63 阅读 · 0 评论 -
2020-12-22
题目描述:给定一个 m x n 的非负整数矩阵来表示一片大陆上各个单元格的高度。“太平洋”处于大陆的左边界和上边界,而“大西洋”处于大陆的右边界和下边界。规定水流只能按照上、下、左、右四个方向流动,且只能从高到低或者在同等高度上流动。请找出那些水流既可以流动到“太平洋”,又能流动到“大西洋”的陆地单元的坐标。解题思路:如果遍历整个矩阵中的所有位置,在不进行剪枝的情况下肯定会出现很多重复求解的过程,我们反过来思考,考虑从大西洋和太平洋出发往上流看可以到达哪些位置,两个都可以到达的位置就是我们的解,这样的原创 2020-12-22 17:01:06 · 62 阅读 · 0 评论 -
547. 朋友圈
题目描述:班上有 N 名学生。其中有些人是朋友,有些则不是。他们的友谊具有是传递性。如果已知 A 是 B 的朋友,B 是 C 的朋友,那么我们可以认为 A 也是 C 的朋友。所谓的朋友圈,是指所有朋友的集合。给定一个 N * N 的矩阵 M,表示班级中学生之间的朋友关系。如果M[i][j] = 1,表示已知第 i 个和 j 个学生互为朋友关系,否则为不知道。你必须输出所有学生中的已知的朋友圈总数。解题思路:搞清楚这个矩阵表示的图的节点和边即可,然后循环调用dfs即可class Solution:原创 2020-12-22 16:31:59 · 61 阅读 · 0 评论