算法记录
LeetCode 题目:
找出所有相加之和为 n 的 k 个数的组合,且满足下列条件,只使用数字1到9、每个数字最多使用一次。
返回所有可能的有效组合的列。该列表不能包含相同的组合两次,组合可以以任何顺序返回。
说明
一、题目
输入: k = 3, n = 7
输出: [[1,2,4]]
解释: 1 + 2 + 4 = 7,没有其他符合的组合了,因为他们是相邻的。
二、分析
- 题目就是一个简单的深度优先问题,因为是从
1 - 9的不可重复数据,我们就可以直接限定取值区间了,不用太多的其他计算。 - 递归的基本条件就是从当前区间中取出 k 个数字组合成和为 n 的序列,每次添加一个数字就将目标值减去,直到
k == 0 && n == 0这个时候就可认为是一个符合条件的序列。 - 其余的出现任意一个为零的情况都应该是递归的出口,避免栈溢出。
- 因为不能重复使用数字,因此下一个数字的索引区间一定是在当前数字之后的,也就是在
+1的数据区间进行查找。
class Solution {
private List<List<Integer>> ret = new ArrayList();
private List<Integer> temp = new ArrayList();
public List<List<Integer>> combinationSum3(int k, int n) {
dfs(1, 9, n, k);
return ret;
}
public void dfs(int start, int end, int k, int n) {
if(k == 0 && n == 0) {
ret.add(new ArrayList(temp));
return;
}
if(k <= 0 || n <= 0) return;
for(int i = start; i <= end; i++) {
temp.add(i);
dfs(i + 1, end, k - i, n - 1);
temp.remove(temp.size() - 1);
}
}
}
总结
深度优先遍历的方法定义。