Backtracking
文章平均质量分 71
努力努力再努力r
这个作者很懒,什么都没留下…
展开
-
(M)Backtracking:526. Beautiful Arrangement
这道题的意思是,给一个数字N,从1到N的这些书构成一个序列,使得序列中第i个数满足:i能整除这个数,或者这个数能整除i。问给定的N,满足这个要求的序列能有多少个。想到了卖火柴的小女孩那个题,Matchsticks to Square。这个题里出现一个问题是,求一个数组能不能分成四个和相等的数组。写法和这个差不多。遍历每一个位置i,看i位置能放哪个数,放下这个数后对i+1递归,然后i这个位置试着放下原创 2017-10-18 22:21:36 · 189 阅读 · 0 评论 -
(M)Backtracking: 93. Restore IP Addresses
这道题的意思是,给出一个字符串,写出这个字符串可以构成那些ip地址。IP地址有四个数字,每一个数字的范围都是[0,255],而且要注意没一个数都不能是0开头。单独写一个函数判断一个字符串是不是合法的IP地址中的某一个数。class Solution {public: vector restoreIpAddresses(string s) { vector re原创 2017-10-20 19:05:22 · 219 阅读 · 0 评论 -
(M)Backtracking:60. Permutation Sequence
感觉应该算是一个找规律题,看了大神的分析才知道怎么做:a1 = k / (n - 1)!k1 = ka2 = k1 / (n - 2)!k2 = k1 % (n - 2)!...an-1 = kn-2 / 1!kn-1 = kn-2 / 1!an = kn-1 / 0!kn = kn-1 % 0! class Solution {public:原创 2017-10-20 19:03:23 · 196 阅读 · 0 评论 -
(M)Backtracking:47. Permutations II
看大神分析:这道题是之前那道 Permutations 全排列的延伸,由于输入数组有可能出现重复数字,如果按照之前的算法运算,会有重复排列产生,我们要避免重复的产生,在递归函数中要判断前面一个数和当前的数是否相等,如果相等,前面的数必须已经使用了,即对应的visited中的值为1,当前的数字才能使用,否则需要跳过,这样就不会产生重复排列了。class Solution {public原创 2017-10-19 22:35:58 · 184 阅读 · 0 评论 -
(M)Backtracking:131. Palindrome Partitioning
这道题是说,给一个字符串,要把这个字符串分割,分割成几个回文串。写出所有的分割方案。首先想到的方法是,从第一个字符串到最后一个字符串,每一个位置都可以选择分割或不分割。所以一个位置一个位置的遍历,再写一个判断一个字符串是否是回文串的函数。这样复杂度很高,本以为会超时,但是ac了。class Solution {public: vector> partition(string s)原创 2017-10-19 21:33:32 · 154 阅读 · 0 评论 -
(M)Backtracking:40. Combination Sum II
这道题是Combination Sum的改进,给出一个数组,可能有重复数字,给出一个target,写出所有和为target的组合。这个题的变化是,一个数只能用一次。首先给数组排序,然后按照上一个题的方法写就行。但是这样有一个问题,因为有重复数字,所以有些组合会加两遍。所以我用了set结构,最后再转化成vector返回。class Solution {public: vector>原创 2017-10-19 20:46:42 · 177 阅读 · 0 评论 -
(M)Backtracking:17. Letter Combinations of a Phone Number
这道题让我们求电话号码的字母组合,即数字2到9中每个数字可以代表若干个字母,然后给一串数字,求出所有可能的组合。我想到类似全排列那样的题目,这道题也是典型的回溯问题,每一个位置都有几个选择,求这些选择的全排列。但是以前的题目是,这些位置有一个共同的选择范围,一般是一个数组。但是这个题是,每个位置有每个位置各自不同的选择范围。其实还是一样的,只是要设一个字典,再设一个level表示现在是在哪一个原创 2017-10-19 20:32:49 · 183 阅读 · 0 评论 -
(M)Backtracking:90. Subsets II
这道题还是给出一个数组,要求找出所有的子集合,但是与之前不同的是,这次给出的数组有重复的数。看了大神的分析:拿题目中的例子[1 2 2]来分析,根据之前 Subsets 子集合 里的分析可知,当处理到第一个2时,此时的子集合为[], [1], [2], [1, 2],而这时再处理第二个2时,如果在[]和[1]后直接加2会产生重复,所以只能在上一个循环生成的后两个子集合后面加2,发现了这一点原创 2017-10-19 20:13:31 · 216 阅读 · 0 评论 -
(M)Backtracking:39. Combination Sum
这道题意思是给你一个数组,再给你一个目标值target,写出所有和是target的子数组。这个题一开始求出来的结果是[2,2,3][2,3,2][3,2,2][7],发现有重复的,所以先把数组从小到大排序,选择数字的时候只往右边选,不往回选,这样就不会出现重复数组了。class Solution {public: vector> combinationSum(vector& ca原创 2017-10-19 15:55:58 · 139 阅读 · 0 评论 -
(M)Backtracking:77. Combinations
这道题的意思是给一个数n,再给一个数k,问1~n这些数字里面能够成多少个长度为k的组合。简单的回溯。class Solution {public: vector> combine(int n, int k) { vector> res; vector r; backtracking(n, k, 1, res, r); r原创 2017-10-19 15:44:34 · 215 阅读 · 0 评论 -
(M)Backtracking:78. Subsets
这道题是给出一个数组,写出他的所有子集合。一开始我的想法是,子集合里存放的数字个数可能是0个,1个,2个...n个,针对这n+1种可能,每一种分别求。但是没有调出来。后来看了别人代码,发现不用这么麻烦,每次递归都往结果集里加就可以。class Solution {public: vector> subsets(vector& nums) { vector> res原创 2017-10-19 14:27:41 · 214 阅读 · 0 评论 -
(M)Backtracking:46. Permutations
输出给定数组的所有全排列。这道题还是比较简单的回溯。根据上一篇216Combination Sum3的经验,这次是要输出给定数组的所有全排列,要用到一个visit数组来标识哪些数现在是可以选的。class Solution {public: vector> permute(vector& nums) { vector> res; vector原创 2017-10-19 11:18:31 · 175 阅读 · 0 评论 -
(M)Backtracking:216. Combination Sum III
这道题的意思是找出所有可能的和为n的k项组合,组合的项仅能从1-9中选择,且组合中数字不能重复。这个题比较简单,回溯法。选k个数,每一个位置都有1-9这些可能,选择满足条件的一个然后在现在的状态下继续递归。一开始我想用一个vector表示1~9这些数字中还有哪些没有选过。但是这样出现了答案中的数字一样但是顺序不一样,也算成了不同的答案。但实际上选择一样的数字只需要一个就可以了。看了大神的解答,原创 2017-10-19 11:06:25 · 143 阅读 · 0 评论 -
(M)Backtracking:22. Generate Parentheses
这道题网上很多大神分析,我没有写出来,原因是没有发现一个重要的线索是,在某一个时刻必须要保证左括号数>右括号数,否则现在的字符串就是不满足要求的。对于每一个位置,都有两个选择:放左括号或者放右括号。放左括号没有限制,只要现在手头上还有剩余的左括号就可以放,放右括号有限制条件,不仅仅手头上要有剩余的右括号可以放,而且当前已经有的左括号数必须大于已经有的右括号数,如果当前的左括号数小于等于当前右括号数原创 2017-10-18 23:03:08 · 147 阅读 · 0 评论 -
(M)Backtracking:79. Word Search
这道题意思是给一个由字符构成的二维数组,再给出一个字符串,问字符串能否由这个二维数组中的字符构成,要求是每个字符在二维数组中的位置必须和上一个字符在二维数组中的位置是相邻的。一个字符可能在二维数组中出现多次,所以遍历二维数组,每遇到一个和当前正在找的字符一样的字符,就递归到寻找下一层的函数。如果返回true,说明找到了一个可行解。如果不成功,说明这个位置得不到可行解,那么就接下去遍历二维数组,原创 2017-10-20 19:22:26 · 172 阅读 · 0 评论