题目在这:
❌错误解法示例:写成总和为n的<=k 个数的组合了(Shit!!!)
class Solution {
List<List<Integer>> ans=new ArrayList<>();
public List<List<Integer>> combinationSum3(int k, int n) {
if(n>10*k-k*(k+1)/2| n<k*(k+1)/2){
return new ArrayList<>();
}
backtracking(0,n,new ArrayList<Integer>(),1,k);
return ans;
}
public void backtracking(int pathsum,int n,List<Integer> list,int index,int k){
if (pathsum == n) {
ans.add(new ArrayList<>(list));
return;
}
if(list.size()>=k){
return;
}
for (int i = index; i <= 9; i++) {
list.add(i);
backtracking(pathsum+i , n, list, i + 1,k);
list.remove(list.size() - 1);
}
}
}
✔解决办法:打个补丁
if (pathsum == n & list.size()==k) {
ans.add(new ArrayList<>(list));
return;
}
......
🔣关键记录1:可用于预先进行判断的代码(不用也能解,只是能够减少特殊情况的运算)
if(n>10*k-k*(k+1)/2| n<k*(k+1)/2){
return new ArrayList<>();
}
🔣关键记录2:回溯法模板(源自某题解,是模板不是题解,照葫芦画瓢改改就可以了)
class Solution {
List<List<Integer>> listTotal = new ArrayList<>();
private void backtrack(int n, int k, List<Integer> list, int index) {
if (list.size() == k) {
listTotal.add(new ArrayList<>(list));
return;
}
for (int i = index; i <= n; i++) {
list.add(i);
backtrack(n , k, list, i + 1);
list.remove(list.size() - 1);
}
}
public List<List<Integer>> combine(int n, int k) {
backtrack(n, k, new ArrayList<Integer>(), 1);
return listTotal;
}
}