
dfs
Betternw
这个作者很懒,什么都没留下…
展开
-
【dfs回溯 if条件判断后回溯】 22括号生成
题目数字 n 代表生成括号的对数,请你设计一个函数,用于能够生成所有可能的并且 有效的 括号组合。输入:n = 3输出:[“((()))”,“(()())”,“(())()”,“()(())”,“()()()”]思路回溯算法当左右括号都有大于0个剩余可以使用,才产生组合放入左括号时,只看是否还有左括号需要使用产生右括号时,需要保证右边剩余大于左边的才可以减1进行组合在左边和右边剩余0的时候进行结算代码public List<String> generatePar原创 2020-06-16 23:18:48 · 151 阅读 · 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 · 248 阅读 · 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 · 220 阅读 · 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 · 110 阅读 · 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 · 135 阅读 · 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 · 163 阅读 · 0 评论 -
[dfs bfs] 199 二叉树的右视图
题目给定一棵二叉树,想象自己站在它的右侧,按照从顶部到底部的顺序,返回从右侧所能看到的节点值。输入: [1,2,3,null,5,null,4]输出: [1, 3, 4]1 <—/ 2 3 <—\ 5 4 <—思路dfs,按照根、右、左的顺序遍历,可以保证每层第一个访问的是最右边的节点。用深度做比较,结果集中存放的元素个数,和深度是对应的。当遍历到新的一层时,如果depth==结果集大小,说明原创 2020-07-01 19:42:06 · 155 阅读 · 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 · 127 阅读 · 0 评论 -
【dfs】 108将有序数组转换成二叉搜索树
题目将一个按照升序排列的有序数组,转换为一棵高度平衡二叉搜索树。本题中,一个高度平衡二叉树是指一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1。思路二叉搜索树中序遍历就是升序数组。又因为是平衡树,所以以中间元素作为根节点代码 public class TreeNode { int val; TreeNode left; TreeNode right; TreeNode(int x) { val = x; }} public TreeNode so原创 2020-07-03 16:56:04 · 80 阅读 · 0 评论 -
【递归??】 offer33 二叉搜索树的后序遍历序列
题目输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历结果。如果是则返回 true,否则返回 false。假设输入的数组的任意两个数字都互不相同。5/ 2 6/ 1 3输入: [1,6,3,2,5]输出: false输入: [1,3,2,6,5]输出: true分析最后一个是根节点,找到左子树和右子树,然后递归判断。当只有一个节点的时候,符合要求,找左子树的时候左边区域一定都是小于根节点的,判断右子树,当寻找右子树指针和根节点重合说明不符合要求。代码public b原创 2020-07-08 00:23:30 · 129 阅读 · 0 评论 -
【中序遍历】 offer 54 二叉搜索树的第K大节点
题目给定一棵二叉搜索树,请找出其中第k大的节点。示例 1:输入: root = [3,1,4,null,2], k = 13/ 1 42输出: 4示例 2:输入: root = [5,3,6,2,4,null,null,1], k = 35/ 3 6/ 2 4/1输出: 4思路二叉搜索树和中序遍历有关系,中序遍历二叉搜索树的逆序就是递增序列。因此采用递归,进行中序遍历的逆序。并且传入计数变量和结果变量,每经过一个节点数量减1,当k=0的时候,将当前节点值原创 2020-07-11 11:21:19 · 133 阅读 · 0 评论 -
【dfs 中序】 offer36 二叉搜索树与双向链表
题目将一个二叉搜索树转换成循环双向链表思路二叉搜索树按中序遍历出就是升序序列,再标注一个前驱节点就可以进行链表的连接。代码Node pre,head;public Node treeToDoublyList(Node root) { if(root==null) return null; dfs(root); //得到头尾结点,将头尾连接 head.left = pre; pre.right = head; return head;}publ原创 2020-07-02 11:10:51 · 83 阅读 · 0 评论 -
【递归】offer13 机器人的运动范围
题目地上有一个m行n列的方格,从坐标 [0,0] 到坐标 [m-1,n-1] 。一个机器人从坐标 [0, 0] 的格子开始移动,它每次可以向左、右、上、下移动一格(不能移动到方格外),也不能进入行坐标和列坐标的数位之和大于k的格子。例如,当k为18时,机器人能够进入方格 [35, 37] ,因为3+5+3+7=18。但它不能进入方格 [35, 38],因为3+5+3+8=19。请问该机器人能够到达多少个格子?输入:m = 2, n = 3, k = 1输出:3输入:m = 3, n = 1, k =原创 2020-07-04 19:48:46 · 161 阅读 · 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 · 107 阅读 · 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 · 105 阅读 · 0 评论 -
【深度搜索 有1就感染成2,统计第一个1的个数。 并查集】200 岛屿数量
题目给你一个由 ‘1’(陆地)和 ‘0’(水)组成的的二维网格,请你计算网格中岛屿的数量。岛屿总是被水包围,并且每座岛屿只能由水平方向或竖直方向上相邻的陆地连接形成。输入:11110110101100000000输出: 1输入:11000110000010000011输出: 3思路深度或者广度遍历,遇到1就变成2,然后递归该节点周围的所有节点,当超出范围或不为1(0,2)时退出循环。主函数中遇到1就岛屿数量加1.大矩阵,将矩阵划分,在进行变2的过程中,记录每次开始变2的点是原创 2020-06-12 10:38:00 · 146 阅读 · 0 评论