本文包含如下题目:
17. Letter Combinations of a Phone Number
31. Next Permutation
39. Combination Sum
40. Combination Sum II
46. Permutations
47. Permutations II
60. Permutation Sequence
77. Combinations
216. Combination Sum III
377. Combination Sum IV
17. Letter Combinations of a Phone Number
解题思路
- 加入现在输入是
23
,则首先把2
对应的字符放到结果res中,结果res为[a, b, c]
;3
所包含的字符有d, e, f
则首先把res的首项取出来,分别和d, e, f
组合之后再次放进res中,此时为[b, c, ad, ae, af]
;- 不断地完成如上操作即可;
代码
1 | class Solution |
31. Next Permutation
解题思路
- 终极状态是
321
这种呈递减顺序排布的,也是数字组合的最大值;- 首先找到第一个破坏上述规则的数,其位置记为start;
- 将start对应元素与从尾部开始第一个大于它的元素交换;
- 对于start后面的元素进行一个逆序处理即可;
- 详细分析可以参考LeetCode的官方Solution;
代码
1 | class Solution |
39. Combination Sum
解题思路
- 使用回溯和递归,不断地去找就好;
- 注意给出的数据均为正数,且没有重复的数值;
代码
1 | class Solution |
40. Combination Sum II
解题思路
- 这一题跟上面39题类似,注意这里给出的数据中包含重复的数值;
- 为了避免重复解,对candidates进行排序,重复数值只对第一个进行迭代求解,其余的跳过;
代码
1 | class Solution |
46. Permutations
解题思路I
- 这一题仍然是排列组合,但是不同的是这一次不看数值的大小,直接按照排列组合的顺序输出;
代码
1 | class Solution |
解题思路II
- 也可以使用dfs进行求解,遍历每一种不同的组合方式;
代码
1 | class Solution |
47. Permutations II
解题思路I
- 首先使用
sort
函数整理数据,然后按照next premutation的算法不断进行求取;- 这里需要注意的是,交换过程中,如果相等则不进行交换,使用
<=
过滤掉重复的答案;
代码
1 | class Solution |
解题思路II
- 这里借鉴了LeetCode Discuss中的思路,仍然采用的是dfs搜索的方式去遍历每一种可能的结果;
- 不同的是,针对本题没有回溯操作,nums作为参数前面并没有加
&
号;- 这个思路搞了好久没有弄清楚,有大神懂的求告知;
代码
1 | class Solution |
60. Permutation Sequence
解题思路
- 如果不断调用next permutation算法,则肯定会超时;
- 我们一位一位的计算,一共有
n!
种序列,第一位有n
中选择,每种都对应(n-1)!
种序列,利用这种关系不断计算每一位的选择即可;
代码
1 | class Solution |
77. Combinations
解题思路
- 这个题直接用递归和回溯就解决了;
代码
1 | class Solution |
216. Combination Sum III
解题思路
- 这道题也是使用递归和回溯就可以解决了;
代码
1 | class Solution |
377. Combination Sum IV
解题思路I
- 使用搜索算法进行迭代,TLE超时!
代码
1 | class Solution |
解题思路II
- 如果nums包含
1, 2, 3
三个数字,Sum(nums, 4) = Sum(nums, 4-1) + Sum(nums, 4-2) + Sum(nums, 4-3)
;- 如果根据上述等式进行递归迭代求解的话,超时TLE!
- 根据公式的特性,使用DP进行求解,
dp[i] = Sum(nums, i)
,dp[0]=1初始化即可;
代码I
1 | class Solution |
代码II
1 | class Solution |