递归与回溯
递归与回溯算法的联系
另一花生
竹杖芒鞋轻胜马,一蓑烟雨任平生
展开
-
47. 全排列 II
给定一个可包含重复数字的序列 nums ,按任意顺序 返回所有不重复的全排列。输入:nums = [1,1,2]输出:[[1,1,2], [1,2,1], [2,1,1]]输入:nums = [1,2,3]输出:[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]class Solution { //存放结果 List<List<Integer>> result = new Array原创 2022-01-21 00:29:20 · 645 阅读 · 0 评论 -
491. 递增子序列
给你一个整数数组 nums ,找出并返回所有该数组中不同的递增子序列,递增子序列中 至少有两个元素 。你可以按 任意顺序 返回答案。数组中可能含有重复元素,如出现两个整数相等,也可以视作递增序列的一种特殊情况。输入:nums = [4,6,7,7]输出:[[4,6],[4,6,7],[4,6,7,7],[4,7],[4,7,7],[6,7],[6,7,7],[7,7]]输入:nums = [4,4,3,2,1]输出:[[4,4]]class Solution { p原创 2022-01-20 23:58:04 · 513 阅读 · 0 评论 -
90. 子集 II
给你一个整数数组 nums ,其中可能包含重复元素,请你返回该数组所有可能的子集(幂集)。解集 不能 包含重复的子集。返回的解集中,子集可以按 任意顺序 排列。输入:nums = [1,2,2]输出:[[],[1],[1,2],[1,2,2],[2],[2,2]]输入:nums = [0]输出:[[],[0]]class Solution { List<List<Integer>> result = new ArrayList<>原创 2022-01-09 11:35:52 · 78 阅读 · 0 评论 -
78. 子集
给你一个整数数组nums,数组中的元素互不相同。返回该数组所有可能的子集(幂集)。解集 不能 包含重复的子集。你可以按 任意顺序 返回解集。输入:nums = [1,2,3]输出:[[],[1],[2],[1,2],[3],[1,3],[2,3],[1,2,3]]输入:nums = [0]输出:[[],[0]]class Solution { List<List<Integer>> result = new ArrayList&l...原创 2022-01-09 11:13:11 · 66 阅读 · 0 评论 -
93. 复原 IP 地址
有效 IP 地址 正好由四个整数(每个整数位于 0 到 255 之间组成,且不能含有前导 0),整数之间用 '.' 分隔。例如:"0.1.2.201" 和 "192.168.1.1" 是 有效 IP 地址,但是 "0.011.255.245"、"192.168.1.312" 和 "[email protected]" 是 无效 IP 地址。给定一个只包含数字的字符串 s ,用以表示一个 IP 地址,返回所有可能的有效 IP 地址,这些地址可以通过在 s 中插入'.' 来形成。你不能重新排序或删除 s 中的任何数.原创 2022-01-09 09:59:31 · 73 阅读 · 0 评论 -
131. 分割回文串
给你一个字符串 s,请你将 s 分割成一些子串,使每个子串都是 回文串 。返回 s 所有可能的分割方案。回文串 是正着读和反着读都一样的字符串。输入:s = "aab"输出:[["a","a","b"],["aa","b"]]输入:s = "a"输出:[["a"]]列出如下几个难点:切割问题可以抽象为组合问题 如何模拟那些切割线 切割问题中递归如何终止 在递归循环中如何截取子串 如何判断回文class Solution { List<Li.原创 2022-01-09 00:31:27 · 75 阅读 · 0 评论 -
40. 组合总和 II
给你一个由候选元素组成的集合 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。candidates 中的每个元素在每个组合中只能使用 一次 。注意:解集不能包含重复的组合。输入: candidates =[10,1,2,7,6,1,5], target =8,输出:[[1,1,6],[1,2,5],[1,7],[2,6]]输入: candidates =[2,5,2,1,2], targe...原创 2022-01-08 23:59:15 · 207 阅读 · 0 评论 -
39. 组合总和
给你一个 无重复元素 的整数数组 candidates 和一个目标整数 target ,找出 candidates 中可以使数字和为目标数 target 的 所有不同组合 ,并以列表形式返回。你可以按 任意顺序 返回这些组合。candidates 中的 同一个 数字可以 无限制重复被选取 。如果至少一个数字的被选数量不同,则两种组合是不同的。对于给定的输入,保证和为 target 的不同组合数少于 150 个。输入:candidates = [2,3,6,7], target = 7输出:[原创 2022-01-08 18:40:54 · 66 阅读 · 0 评论 -
17. 电话号码的字母组合
给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。答案可以按 任意顺序 返回。给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。输入:digits = "23"输出:["ad","ae","af","bd","be","bf","cd","ce","cf"]输入:digits = ""输出:[]输入:digits = "2"输出:["a","b","c"]class Solution { //设置全局列表存原创 2022-01-08 15:10:47 · 72 阅读 · 0 评论 -
216. 组合总和 III
找出所有相加之和为 n 的 k 个数的组合。组合中只允许含有 1 - 9 的正整数,并且每种组合中不存在重复的数字。输入: k = 3, n = 7输出: [[1,2,4]]输入: k = 3, n = 9输出: [[1,2,6], [1,3,5], [2,3,4]]class Solution { List<List<Integer>> result = new ArrayList(); LinkedList<Integ.原创 2022-01-08 14:35:35 · 58 阅读 · 0 评论 -
46. 全排列
给定一个不含重复数字的数组nums,返回其所有可能的全排列。你可以按任意顺序返回答案。输入:nums = [1,2,3]输出:[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]输入:nums = [0,1]输出:[[0,1],[1,0]]输入:nums = [1]输出:[[1]]模板代码:for (int i = 0; i < nums.size(); i++) { if (used...原创 2022-01-08 11:13:29 · 68 阅读 · 0 评论 -
994. 腐烂的橘子
在给定的网格中,每个单元格可以有以下三个值之一:值0代表空单元格;值1代表新鲜橘子;值2代表腐烂的橘子。每分钟,任何与腐烂的橘子(在 4 个正方向上)相邻的新鲜橘子都会腐烂。返回直到单元格中没有新鲜橘子为止所必须经过的最小分钟数。如果不可能,返回 -1。输入:mat = [[0,0,0],[0,1,0],[0,0,0]]输出:[[0,0,0],[0,1,0],[0,0,0]]输入:mat = [[0,0,0],[0,1,0],[1,1,1]]...原创 2022-01-07 14:17:04 · 114 阅读 · 0 评论 -
733. 图像渲染
有一幅以二维整数数组表示的图画,每一个整数表示该图画的像素值大小,数值在 0 到 65535 之间。给你一个坐标(sr, sc)表示图像渲染开始的像素值(行 ,列)和一个新的颜色值newColor,让你重新上色这幅图像。为了完成上色工作,从初始坐标开始,记录初始坐标的上下左右四个方向上像素值与初始坐标相同的相连像素点,接着再记录这四个方向上符合条件的像素点与他们对应四个方向上像素值与初始坐标相同的相连像素点,……,重复该过程。将所有有记录的像素点的颜色值改为新的颜色值。最后返回经过上色渲染...原创 2021-12-20 08:02:03 · 213 阅读 · 0 评论 -
542. 01 矩阵
给定一个由 0 和 1 组成的矩阵 mat,请输出一个大小相同的矩阵,其中每一个格子是 mat 中对应位置元素到最近的 0 的距离。两个相邻元素间的距离为 1 。输入:mat = [[0,0,0],[0,1,0],[0,0,0]]输出:[[0,0,0],[0,1,0],[0,0,0]]输入:mat = [[0,0,0],[0,1,0],[1,1,1]]输出:[[0,0,0],[0,1,0],[1,2,1]]首先把每个源点 0 入队,然后从各个 0 同时开始一圈..原创 2021-12-21 13:27:33 · 250 阅读 · 0 评论 -
695. 岛屿的最大面积
给你一个大小为 m x n 的二进制矩阵 grid 。岛屿是由一些相邻的1(代表土地) 构成的组合,这里的「相邻」要求两个 1 必须在 水平或者竖直的四个方向上 相邻。你可以假设grid 的四个边缘都被 0(代表水)包围着。岛屿的面积是岛上值为 1 的单元格的数目。计算并返回 grid 中最大的岛屿面积。如果没有岛屿,则返回面积为 0 。输入:grid = [[0,0,1,0,0,0,0,1,0,0,0,0,0],[0,0,0,0,0,0,0,1,1,1,0,0,0],[0,1...原创 2021-12-20 09:28:17 · 194 阅读 · 0 评论 -
77. 组合
给定两个整数 n 和 k,返回范围 [1, n] 中所有可能的 k 个数的组合。你可以按 任何顺序 返回答案。输入:n = 4, k = 2输出:[ [2,4], [3,4], [2,3], [1,2], [1,3], [1,4],]输入:n = 1, k = 1输出:[[1]]如果解决一个问题有多个步骤,每一个步骤有多种方法,题目又要我们找出所有的方法,可以使用回溯算法;回溯算法是在一棵树上的 深度优先遍历(因为要找所有的解,所以需要遍历);原创 2022-01-08 01:40:47 · 68 阅读 · 0 评论