![](https://img-blog.csdnimg.cn/20201014180756922.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
回溯
Betternw
这个作者很懒,什么都没留下…
展开
-
【双指针 相遇问题】 offer57和为s的两个数字/和为目标值的多个数字
题目 输入一个递增排序的数组和一个数字s,在数组中查找两个数,使得它们的和正好是s。如果有多对数字的和等于s,则输出任意一对即可。 示例 1: 输入:nums = [2,7,11,15], target = 9 输出:[2,7] 或者 [7,2] 示例 2: 输入:nums = [10,26,30,31,47,60], target = 40 输出:[10,30] 或者 [30,10] 思路 相遇类型的双指针 代码 public int[] twoSum(int[] nums, int target) {原创 2020-07-12 18:06:18 · 89 阅读 · 0 评论 -
数字字符串转化成IP地址
题目描述 现在有一个只包含数字的字符串,将该字符串转化成IP地址的形式,返回所有可能的情况。 例如: 给出的字符串为"25525522135", 返回[“255.255.22.135”, “255.255.221.35”]. (顺序没有关系) 分析 回溯法插入’.’,每次可以插入到1个,2个或者3个字符后面,插入3次之后对得到的字符串进行验证 代码 import java.util.*; public class Solution { /** * * @param s st原创 2021-08-01 16:35:09 · 599 阅读 · 0 评论 -
112 路径总和
题目描述 给你二叉树的根节点 root 和一个表示目标和的整数 targetSum ,判断该树中是否存在 根节点到叶子节点 的路径,这条路径上所有节点值相加等于目标和 targetSum 。 叶子节点 是指没有子节点的节点。 示例 1: 输入:root = [5,4,8,11,null,13,4,7,2,null,null,null,1], targetSum = 22 输出:true 分析 若当前节点就是叶子节点,那么直接判断 sum 是否等于 val 即可(因为路径和已经确定,就是当前节点的值,我们只需原创 2021-07-19 21:20:26 · 54 阅读 · 0 评论 -
【回溯】 40 组合总和2
思路 重复:有两种重复情况 【11111】:通过递归传递的begin参数,每次向下传递都+1.从而避免反复调用自己。 【1 2(第一个2) 5】和【1 2 (第二个2)5】:i > begin && candidates[i] == candidates[i - 1] begin代表的是第几层,i代表的是当前层的第几个数字。【1 2(第一个2) 5】中的2是第begin层的第i=begin个数字。【1 2 (第二个2)5】是第begin层的第i+1>begin个数字。当出现i原创 2020-06-17 21:10:19 · 82 阅读 · 0 评论 -
【回溯】 90 子集2
题目 给定一个可能包含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集)。 说明:解集不能包含重复的子集。 输入: [1,2,2] 输出: [ [2], [1], [1,2,2], [2,2], [1,2], [] ] 思路 和78类似。但是对于有重复元素的数组: 要先进行排序。 要进行判重。begin代表的是第几层,i代表的是当前层的第几个数字。【1 2(第一个2) 5】中的2是第begin层的第i=begin个数字。【1 2 (第二个2)5】是第begin层的第i+1>begin个数原创 2020-06-17 23:02:22 · 86 阅读 · 0 评论 -
【dfs回溯】 113 路径总和
题目 给定一个二叉树和一个目标和,找到所有从根节点到叶子节点路径总和等于给定目标和的路径。 给定如下二叉树,以及目标和 sum = 22, 5 / 4 8 / / 11 13 4 / \ / 7 2 5 1 返回:[ [5,4,11,2], [5,8,4,5] ] 思路 dfs回溯。必须是结尾为叶子节点时才加入列表。 剪枝是:当左孩子为空就遍历右,右为空就遍历左。因为如果不剪枝,当遍历到叶子节点的时候,会遍历一次左孩子遍历一次右孩子,就会有两个重复解。 代码 publi原创 2020-07-02 09:43:10 · 102 阅读 · 0 评论 -
【回溯??】 47全排序2
题目 给出一个可包含重复数字的序列,返回所有不重复的全排列。 输入: [1,1,2] 输出: [ [1,1,2], [1,2,1], [2,1,1] ] 思路 重复的数字被回退后,在下一次的循环中又会遇到。 if(!used[i]) 如果还用这个条件判断,对于存在重复数字的数组比如【1 1 2】,那么就不会形成【112】这个全排列。 在需要剪枝的 ① 处,nums[i - 1] 由于在回溯的过程中刚刚被撤销了选择,因此接下来搜索的过程中还会被选择到,因此一定会发生重复,所以在这里剪枝。 而 ② 处,上一个原创 2020-06-17 22:43:51 · 81 阅读 · 0 评论 -
【回溯 dfs 剪枝】 offer38 字符串的排列
题目 输入一个字符串,打印出该字符串中字符的所有排列。可以以任意顺序返回这个字符串数组,但里面不能有重复元素。 输入:s = “abc” 输出:[“abc”,“acb”,“bac”,“bca”,“cab”,“cba”] 思路 47题同思路 代码 public String[] permutation(String s) { int length = s.length(); if(length==0) return new String[0]; List<原创 2020-07-08 10:45:18 · 72 阅读 · 0 评论 -
【回溯 dfs for循环进入dfs,marked数组标记,direction数组路径】 79 单词搜索
题目 给定一个二维网格和一个单词,找出该单词是否存在于网格中。 单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格。同一个单元格内的字母 不允许被重复使用。 board = [ [‘A’,‘B’,‘C’,‘E’], [‘S’,‘F’,‘C’,‘S’], [‘A’,‘D’,‘E’,‘E’] ] 给定 word = “ABCCED”, 返回 true 给定 word = “SEE”, 返回 true 给定 word = “ABCB”, 返回 false 思路原创 2020-06-23 17:09:31 · 127 阅读 · 0 评论 -
【回溯 dfs for循环 不剪枝直接添加所有结果 for循环原模板】 78 子集
题目 给定一组不含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集)。 说明:解集不能包含重复的子集。 输入: nums = [1,2,3] 输出: [ [3], [1], [2], [1,2,3], [1,3], [2,3], [1,2], [] ] 分析 回溯。 判重:for循环中遍历从当前数开始向后遍历不再遍历之前的。 递归自带终原创 2020-06-17 19:35:16 · 157 阅读 · 0 评论 -
【回溯 做选择-dfs-撤销选择 使用boolean数组和depth进行剪枝】 46 全排列
题目 给定一个没有重复数字的序列,返回其所有可能的全排列。 输入: [1,2,3] 输出: [ [1,2,3], [1,3,2], [2,1,3], [2,3,1], [3,1,2], [3,2,1] ] 思路 回溯算法。 全排列与树的形态一致。递归的终止条件是数字选够,因此选用一个变量表示递归到第几层。 定义一个数组记录哪些数字选用过。 图解全排列+回溯算法原理 代码 public List<List<Integer>> permute(int[] nums) { int原创 2020-06-16 21:51:31 · 278 阅读 · 0 评论 -
【回溯 先排序 做选择-dfs-撤销选择 使用剩余和的值进行剪枝】 39 组合总和
题目 给定一个无重复元素的数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。 candidates 中的数字可以无限制重复被选取。 输入: candidates = [2,3,6,7], target = 7, 所求解集为: [ [7], [2,2,3] ] ...原创 2020-06-17 18:26:12 · 191 阅读 · 0 评论 -
【dfs回溯 if条件判断后回溯】 22括号生成
题目 数字 n 代表生成括号的对数,请你设计一个函数,用于能够生成所有可能的并且 有效的 括号组合。 输入:n = 3 输出:[ “((()))”, “(()())”, “(())()”, “()(())”, “()()()” ] 思路 回溯算法 当左右括号都有大于0个剩余可以使用,才产生组合 放入左括号时,只看是否还有左括号需要使用 产生右括号时,需要保证右边剩余大于左边的才可以减1进行组合 在左边和右边剩余0的时候进行结算 代码 public List<String> generatePar原创 2020-06-16 23:18:48 · 122 阅读 · 0 评论 -
【dfs回溯 条件判断后回溯 for循环中】 17 电话号码的字母组合
题目 给定一个仅包含数字2-9的字符串,返回所有它能表示的字母组合。 给出数字到字母的映射如下(与电话按键相同)。注意1不对应任何字母。 示例: 输入:“23” 输出:[“ad”, “ae”, “af”, “bd”, “be”, “bf”, “cd”, “ce”, “cf”]. 思路 理解流程,自主无法写出代码。 比如要求234的字母组合,用index记录遍历到哪个数字位置。获取到2的对应字母,然后第一个字母与3的字母进行组合。当index遍历到最后时,输出目前累加的字符串结果。 动画演示 代码 Strin原创 2020-06-12 11:47:53 · 143 阅读 · 0 评论