List<List<Integer>> ans = new ArrayList<>();
List<Integer> list = new ArrayList<>();
public List<List<Integer>> combinationSum3(int k, int n) {
dfs(k, n, 1);
return ans;
}
private void dfs(int k, int sum, int p) {
if (list.size() == k) {
if (check(list, sum)) {
ans.add(new ArrayList<>(list));
}
return;
}
for (int i = p; i <= 9; i++) {
//剩余没取的个数大于还需取个数,后面的待取数就已经不够了,不需要搜索了
//+1的目的是:当前i数并没有取,但是9-i是算作已经去了的,
if ((9 - i) + 1 < k - list.size()) {
break;
}
//实际上再下面才会取(list.add(i);)
list.add(i);
dfs(k, sum, i + 1);
list.remove(list.size() - 1);
}
}
private boolean check(List<Integer> list, int sum) {
for (int i = 0; i < list.size(); i++) {
sum -= list.get(i);
}
return sum == 0;
}
likou216组合满足子元素的sum是指定值
最新推荐文章于 2024-06-13 08:37:22 发布