数据结构与算法07-回溯
文章平均质量分 51
回溯
aolaf
这个作者很懒,什么都没留下…
展开
-
13 N皇后(leecode 51)
1 问题n 皇后问题研究的是如何将 n 个皇后放置在 n×n 的棋盘上,并且使皇后彼此之间不能相互攻击。上图为 8 皇后问题的一种解法。给定一个整数 n,返回所有不同的 n 皇后问题的解决方案。每一种解法包含一个明确的 n 皇后问题的棋子放置方案,该方案中 ‘Q’ 和 ‘.’ 分别代表了皇后和空位。示例: 输入: 4输出: [[".Q…", // 解法 1“…Q”,“Q…”,“…Q.”],["…Q.", // 解法 2“Q…”,“…Q”,“.Q…”]]解释: 4 皇后问题原创 2021-02-20 13:34:18 · 213 阅读 · 0 评论 -
12 全排列 II(leecode 47)
1 问题给定一个可包含重复数字的序列 nums ,按任意顺序 返回所有不重复的全排列。示例 1:输入:nums = [1,1,2]输出:[[1,1,2],[1,2,1],[2,1,1]]示例 2:输入:nums = [1,2,3]输出:[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]提示:1 <= nums.length <= 8-10 <= nums[i] <= 102 解法这道题目11 全排列(le原创 2021-02-19 21:41:05 · 230 阅读 · 0 评论 -
11 全排列(leecode 46)
1 问题给定一个 没有重复 数字的序列,返回其所有可能的全排列。示例:输入: [1,2,3]输出:[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]2 解法排列问题与集合不同的地方在于,排列是有序的,也就是说[1,2] 和[2,1] 是两个集合。可以看出元素1在[1,2]中已经使用过了,但是在[2,1]中还要在使用一次1,所以处理排列问题就不用使用startIndex了。但排列问题需要一个used数组,标记已经选择的元素,如图橘原创 2021-02-19 21:13:19 · 217 阅读 · 0 评论 -
10 递增子序列(leecode 491)
1 问题给定一个整型数组, 你的任务是找到所有该数组的递增子序列,递增子序列的长度至少是2。示例:输入: [4, 6, 7, 7] 输出: [[4, 6], [4, 7], [4, 6, 7], [4, 6, 7, 7], [6, 7], [6, 7, 7], [7,7], [4,7,7]]说明:给定数组的长度不会超过15。数组中的整数范围是 [-100,100]。给定数组中可能包含重复数字,相等的数字应该被视为递增的一种情况。2 解法在09 子集II(leecode 90)中我们是通过原创 2021-02-19 20:46:30 · 188 阅读 · 0 评论 -
09 子集II(leecode 90)
1 问题给定一个可能包含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集)。说明:解集不能包含重复的子集。示例:输入: [1,2,2]输出:[[2],[1],[1,2,2],[2,2],[1,2],[]]2 解法这道题目和08 子集(leecode 78)区别就是集合里有重复元素了,而且求取的子集要去重。class Solution {public: vector<int> path; //存放子集 vector<vecto原创 2021-02-19 20:02:29 · 72 阅读 · 0 评论 -
08 子集(leecode 78)
1 问题给定一组不含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集)。说明:解集不能包含重复的子集。示例: 输入: nums = [1,2,3]输出:[[3],[1],[2],[1,2,3],[1,3],[2,3],[1,2],[]]2 解法组合问题和分割问题都是收集树的叶子节点,而求子集问题实际求的是树的所有节点。其实子集也是一种组合问题,因为它的集合是无序的,子集{1,2} 和 子集{2,1}是一样的。「那么既然是无序,取过的元素不会重复取,写回溯算法的原创 2021-02-18 20:43:11 · 81 阅读 · 0 评论 -
07 复原IP地址(leecode 93)
1 问题给定一个只包含数字的字符串,复原它并返回所有可能的 IP 地址格式。有效的 IP 地址 正好由四个整数(每个整数位于 0 到 255 之间组成,且不能含有前导 0),整数之间用 ‘.’ 分隔。例如:“0.1.2.201” 和 “192.168.1.1” 是 有效的 IP 地址,但是 “0.011.255.245”、“192.168.1.312” 和 “192.168@1.1” 是 无效的 IP 地址。示例 1:输入:s = “25525511135”输出:[“255.255.11.135原创 2021-02-19 19:27:04 · 145 阅读 · 0 评论 -
06 分割回文串(leecode 131)
1 问题给定一个字符串 s,将 s 分割成一些子串,使每个子串都是回文串。返回 s 所有可能的分割方案。示例:输入: “aab”输出:[[“aa”,“b”],[“a”,“a”,“b”]]2 解法将切割问题类比为组合问题:例如对于字符串abcdef:组合问题:选取一个a之后,在bcdef中再去选取第二个,选取b之后在cdef中在选取第三个…。切割问题:切割一个a之后,在bcdef中再去切割第二段,切割b之后在cdef中在切割第三段…。递归用来纵向遍历,for循环用来横向遍历,切割原创 2021-02-19 11:14:51 · 275 阅读 · 0 评论 -
05 组合总和II(leecode 40)
1 问题给定一个数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。candidates 中的每个数字在每个组合中只能使用一次。说明:所有数字(包括目标数)都是正整数。解集不能包含重复的组合。示例 1:输入: candidates = [10,1,2,7,6,1,5], target = 8,所求解集为:[[1, 7],[1, 2, 5],[2, 6],[1, 1, 6]]示例 2:输入: cand原创 2021-02-18 20:10:28 · 105 阅读 · 0 评论 -
04 组合总和(leecode 39)
1 问题给定一个无重复元素的数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。candidates 中的数字可以无限制重复被选取。说明:所有数字(包括 target)都是正整数。解集不能包含重复的组合。示例 1:输入:candidates = [2,3,6,7], target = 7,所求解集为:[[7],[2,2,3]]示例 2:输入:candidates = [2,3,5], target =原创 2021-02-18 18:03:04 · 164 阅读 · 0 评论 -
03 电话号码的字母组合(leecode 17)
1 问题给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。示例:输入:“23”输出:[“ad”, “ae”, “af”, “bd”, “be”, “bf”, “cd”, “ce”, “cf”].说明:尽管上面的答案是按字典序排列的,但是你可以任意选择答案输出的顺序。2 解法从示例上来说,输入"23",最直接的想法就是两层for循环遍历了吧,正好把组合的情况都输出了。如果输入"233"呢,那么就三层for原创 2021-02-18 17:05:58 · 235 阅读 · 0 评论 -
02 组合总和III(leecode 216)
1 问题找出所有相加之和为 n 的 k 个数的组合。组合中只允许含有 1 - 9 的正整数,并且每种组合中不存在重复的数字。说明:所有数字都是正整数。解集不能包含重复的组合。示例 1:输入: k = 3, n = 7输出: [[1,2,4]]示例 2:输入: k = 3, n = 9输出: [[1,2,6], [1,3,5], [2,3,4]]2 解法本题就是在[1,2,3,4,5,6,7,8,9]这个集合中找到和为n的k个数的组合。class Solution {publi原创 2021-02-17 21:22:17 · 72 阅读 · 0 评论 -
01 组合(leecode 77)
1 问题给定两个整数 n 和 k,返回 1 … n 中所有可能的 k 个数的组合。示例:输入: n = 4, k = 2输出:[[2,4],[3,4],[2,3],[1,2],[1,3],[1,4],]2 解法把组合问题抽象为如下树形结构可以看出这个棵树,一开始集合是 1,2,3,4, 从左向右取数,取过的数,不在重复取。第一次取1,集合变为2,3,4 ,因为k为2,我们只需要再取一个数就可以了,分别取2,3,4,得到集合[1,2] [1,3] [1,4],以此类推。「每次原创 2021-02-17 20:16:27 · 303 阅读 · 0 评论