回溯 / DFS
文章平均质量分 55
回溯
斯沃福德
这个作者很懒,什么都没留下…
展开
-
LeetCode 547:省份数量
当没有被marked[ ] 标记时,才进行记数,并dfs ,和岛屿问题类似;所求未连通的组数,所以r++在main中记录,而不是在dfs中;使用邻接矩阵记录图,注意和邻接表在遍历时不一样;原创 2022-08-22 21:09:40 · 143 阅读 · 0 评论 -
剑指offer 38:字符串的排列
StringBuffer没有 removeLast(),但是有。StringBuffer没有size() , 但是有。只是 数字换成了 char 字符;追加到Stringbuffer。() 用来删除指定位置的字符。原创 2022-08-12 18:32:59 · 160 阅读 · 0 评论 -
LeetCode 695:岛屿的最大面积
链接题目:这题的⼤体思路和之前完全⼀样,只不过在dfs 函数淹没岛屿时,要记录这个岛屿的⾯积;一次dfs就是遍历当前这个岛屿的所有单元,利用dfs记录当前岛屿的单元个数即面积!注意dfs中记录个数的方式 ! return dfs+dfs+dfs+dfs+1...原创 2022-07-10 17:09:17 · 80 阅读 · 0 评论 -
LeetCode 1020:飞地的数量
链接题目:题目问的也就是封闭岛屿的面积;先把周围用海水淹没;与统计封闭岛屿不同的是: 凡是陆地都算上,而不是只算岛屿个数,所以不需要将岛屿和周围淹没;原创 2022-07-10 16:08:12 · 121 阅读 · 0 评论 -
LeetCode 1254:统计封闭岛屿的数目
链接题目:与岛屿数量有两点不同:1.⽤ 0 表示陆地,⽤ 1 表示海⽔2.让你计算「封闭岛屿」的数⽬。所谓「封闭岛屿」就是上下左右全部被 1 包围的 0,也靠边的陆地不算作「封闭岛屿」。思路:只要提前把靠边的陆地先淹掉令为海水 1 ,然后算出来的就是封闭岛屿了 !......原创 2022-07-09 20:04:37 · 220 阅读 · 0 评论 -
LeetCode 200:岛屿数量
岛屿问题中的回溯则不太一样;①遍历二维数组的每个元素,第一次碰到岛屿时记录数量②将与岛屿及其相邻的都变为海水,以免重复记数只有与岛屿之间有海水相隔开(dfs遇到海水return)的岛屿才会再被记数为什么每次遇到岛屿都要⽤ DFS 算法把岛屿「淹了」呢?主要是可以避免维护 visited 数组,一旦遇到 ‘0’ 就会return;...............原创 2022-07-09 19:18:44 · 144 阅读 · 0 评论 -
LeetCode 39:组合总和
链接题目:组合问题和子集问题等价;之前的组合/子集问题中,通过这个 i 从 start 开始,那么下⼀层回溯树就是从 start + 1 开始,从⽽保证 nums[start] 这个元素不会 被重复使⽤:那么反过来,如果想让每个元素被重复使⽤,我只要把 i + 1 改成 i 即可!这相当于给之前的回溯树添加了⼀条树枝,在遍历这棵树的过程中,⼀个元素可以被⽆限次使⽤:需要设置合适的终止条件以结束算法,即路径和⼤于 target 时就没必要再遍历下去了。总结:元素无重不可复选:组合/子集 通过传.原创 2022-07-09 17:22:52 · 192 阅读 · 0 评论 -
LeetCode 47:全排列 II
链接题目:重复则需要先Arrays.sort 排序;排列问题的输⼊如果存在重复,需要在选择时限制限制两个重复元素的相对位置 !当 则continue !由于是排列而不是子集,遍历到叶子节点才会将path添加res;...............原创 2022-07-09 15:31:13 · 123 阅读 · 0 评论 -
LeetCode 40:组合总和 II
链接组合问题和子集问题等价!问组合也就是问和为tartget的子集;使用额外的sum来记录元素的和!sum记录的元素和path记录的元素相同,在递归到头后也和path一样撤回!元素有重复则① 先排序 ②用 来筛选!注意:当sum已经超过target 就不需要遍历了, 节省开销!...............原创 2022-07-06 20:07:48 · 279 阅读 · 0 评论 -
LeetCode 90:子集 II
链接题目:与子集不同的是题目给的元素有重复,如果按之前的做法会导致答案有重复:这里需要添加选择时的条件以修剪节点!①需要先进⾏排序,让相同的元素靠在⼀起,②如果发现 nums[i] == nums[i-1] 则跳过 ! 同时 i>start注意 :i >start !..................原创 2022-07-06 19:13:42 · 191 阅读 · 0 评论 -
LeetCode 77:组合
链接题目:与子集类似,数据无重复,且(2,1)和(1,2)是一个结果,故不能复选;子集问题中每一个节点都是子集,但组合问题中当元素个数到达k才将path放入res中!注意:集合问题中,给的是数组,for从0到n-1 ;组合问题给的n,for从1到n ;.....................原创 2022-07-06 18:38:56 · 149 阅读 · 0 评论 -
LeetCode 78:子集
链接题目:回溯框架:此题是形式一: 无重复元素不可复选,写回溯算法的时候,for就要从start开始,而不是从0开始! 即(2,1)和(1,2)是一个结果,故不能复选。用start来保证每次递归时遍历数组后面未遍历到的数,而不会重复遍历前面的数最后strat超过数组个数即为终止条件!子集问题中,每个节点都是子集 !需要在递归的前序位置将path添加到res !而不是到叶子节点才添加到res !...........................原创 2022-07-05 20:12:42 · 178 阅读 · 0 评论 -
LeetCode 46:全排列
链接多叉树框架:回溯框架:回溯算法就是纯暴力穷举 !先固定第一位为 1,然后第二位可以是 2,那么第三位只能是 3;然后可以把第二位变成 3,第三位就只能是 2 了;然后就只能变化第一位,变成 2,然后再穷举后两位……其实这就是回溯算法可以看作是一棵多叉树 !用path记录遍历的节点,当遍历到叶子节点时将path存入res 就向上返回,每向上返回一层就将path的末尾删除一个节点,以此维护path;用onPath布尔数组记录单条线路上的遍历情况避免重复,或直接用path.contains(原创 2022-07-02 20:05:26 · 172 阅读 · 0 评论