DFS
996冲冲冲
这个作者很懒,什么都没留下…
展开
-
leetcode212. 单词搜索 II
前缀树加回溯,前缀树的作用是把单词放到树上,这样就不需要对每个word进行查询,遍历字符矩阵每个元素当作开头看是否能匹配就可以了。具体做法就是对于一条路径,我们如果到达了叶子节点就说明这条路径上的所有单词都已经加入答案了。这里的剪枝其实就是如果words里面的单词都找到了,那么就不需要再找了。这样在回溯回的时候可以删除这条路径没有分支的节点了。思路对于每个单词都进入字符矩阵搜索一遍。原创 2022-12-08 17:06:55 · 141 阅读 · 0 评论 -
leetcode395. 至少有 K 个重复字符的最长子串
这里采用字典记录这段字串里的元素个数,如果字典里所有元素的个数都大于k说明符合条件。把字符串按照不符合条件的字符进行分割,最后剩下的最长的那段就是答案。思路其实比较简单,但是代码比较难理解。尤其是递归寻找的时候何时返回答案。原创 2022-11-06 20:55:54 · 84 阅读 · 0 评论 -
LC802. 找到最终的安全状态
BFS判断是否有环,因为题目定义的是出度为0的为安全节点。所以想要用BFS拓扑排序需要把图反转def eventualSafeNodes(self, graph): """ :type graph: List[List[int]] :rtype: List[int] """ res =[] queue = deque() out = [0]*(len(graph)) mp = [原创 2022-05-09 21:28:04 · 41 阅读 · 0 评论 -
LC721. 账户合并
建图之后深度优先搜索,本题的关键就在于建图,图里所有有边相连的邮箱肯定属于同一个人def accountsMerge(self, accounts): """ :type accounts: List[List[str]] :rtype: List[List[str]] """ graph = collections.defaultdict(list) #Python中通过Key访问字典,当Key不存在时,会引发‘KeyEr原创 2022-04-28 16:41:24 · 147 阅读 · 0 评论 -
LC690. 员工的重要性
BFS,这题主要考察对数据结构的掌握,把员工的数据以哈希表的形式进行存储,通过id获取整个员工的信息def getImportance(self, employees, id): """ :type employees: List[Employee] :type id: int :rtype: int """ total = 0 mp = {employee.id: employee for e原创 2022-04-28 10:25:13 · 503 阅读 · 0 评论 -
LC547. 省份数量
DFS这题和LC200很相似,但是岛屿是二维的,而这个只算一维的,因为行数和列数都是省份的数量,1表示两个省份是否连接。所以这一题需要注意的就是把它用一维的思想进行处理def findCircleNum(self, isConnected): """ :type isConnected: List[List[int]] :rtype: int """ visited = set() cities = len(i原创 2022-04-27 17:16:12 · 127 阅读 · 0 评论 -
LC417. 太平洋大西洋水流问题
DFS,求矩阵中可以流向左上和右下两边的节点,可以逆向思维,从两边求可以反向到矩阵中的节点再对它们取交集。def pacificAtlantic(self, heights): """ :type heights: List[List[int]] :rtype: List[List[int]] """ r = len(heights) l = len(heights[0]) Pacific =原创 2022-04-27 14:34:17 · 61 阅读 · 0 评论 -
LC365. 水壶问题
广度优先遍历每次操作不外乎6种情况,y加满水/y排空水/x加满水/x排空水/y倒入x中(2 cases)/x倒入y中(2 cases):y加满水:(cur_x,y).y排空水:(cur_x,0).x加满水:(x,cur_y).x排空水:(0,cur_y).y倒入x中(2 cases):假设倒入水的容量为V:则y中剩余:cur_y-V;x中拥有:cur_x+V;若倒完之后y还有剩余,说明x已满:V=x-cur_x故在这种情况下:(x,cur_y+cur_x-x)若倒完之后y空了,说明:V=原创 2022-04-26 19:58:00 · 233 阅读 · 0 评论 -
LC530. 二叉搜索树的最小绝对差
中序遍历迭代def getMinimumDifference(self, root): """ :type root: TreeNode :rtype: int """ pre = None res = 10**4 stack = [] while stack or root: if root: stack.append(r原创 2022-04-26 10:46:47 · 454 阅读 · 0 评论 -
LC133. 克隆图
DFS,克隆图就是要返回图的深拷贝,所以我们要新建一个一模一样的图所以需要对图进行遍历,和多叉树一样,先遍历根节点,如果是新的节点没有遇到过,我们就新建一个一样的节点之后用一个哈希表进行标记,访问过这个节点了说明已经建好了,下次如果出现在哈希表中的节点就不需要再新建了因为节点类还包含他的邻居节点列表,所以遍历它的邻居,将新建节点的邻居节点也建立出来并加入列表,同样,如果建立过这个节点,说明这个节点已经是新的了,直接返回就行。def cloneGraph(self, node): "原创 2022-04-25 21:45:12 · 132 阅读 · 0 评论 -
LC310. 最小高度树
单纯BFS超时def findMinHeightTrees(self, n, edges): """ :type n: int :type edges: List[List[int]] :rtype: List[int] """ g = [[] for _ in range(n)] for x, y in edges: #建立邻接表 g[x].appe原创 2022-04-25 10:13:39 · 183 阅读 · 0 评论 -
LC559. N 叉树的最大深度
BFSdef maxDepth(self, root): """ :type root: Node :rtype: int """ if not root: return 0 res = 0 stack = deque([root]) while stack: for i in range(len(stack)):原创 2022-04-23 21:58:36 · 83 阅读 · 0 评论 -
LC301. 删除无效的括号
DFS+剪枝def removeInvalidParentheses(self, s): """ :type s: str :rtype: List[str] """ l = r = 0 for c in s: if c == '(': l += 1 elif c == ')': if l:原创 2022-04-21 21:14:09 · 97 阅读 · 0 评论 -
LC130. 被围绕的区域
从四个边开始找O,找到了就找与其连通的区域。把它们换成其他的标记。换完了之后遍历整个数组,把换掉的O换回来。把没换的O换成Xdef solve(self, board): """ :type board: List[List[str]] :rtype: None Do not return anything, modify board in-place instead. """ def dfs(x, y):原创 2022-04-15 16:34:50 · 74 阅读 · 0 评论