找出所有相加之和为 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]]
这一题是一个明显的深搜问题
class Solution {
public List<List<Integer>> combinationSum3(int k, int n) {
List<List<Integer>> res = new ArrayList<>();
search(res, new ArrayList<Integer>(), n, k, 0);
return res;
}
public void search(List<List<Integer>> res, List<Integer> temp, int n, int k,int s) {
if (temp.size() == k)
return;
for (Integer i = 1; i <= 9; i++) {
if (i >= n)
return;
if (!temp.contains(i)) {
if (s + i < n && temp.size() < k) {
temp.add(i);
search(res, temp, n, k,s + i);
temp.remove(temp.size() - 1);
}else if (s + i == n && temp.size() == k - 1) {
temp.add(i);
if (notIn(res, temp)) {
in(res, temp);
}
temp.remove(temp.size() - 1);
return;
}
}
}
}
public boolean notIn(List<List<Integer>> res, List<Integer> item) {
for (List<Integer> i : res) {
if (i.containsAll(item))
return false;
}
return true;
}
public void in(List<List<Integer>> res, List<Integer> item) {
List<Integer> newList = new ArrayList<>();
newList.addAll(item);
res.add(newList);
}
}