【组合递归回溯】【removeLast】Leetcode 39. 组合总和
---------------🎈🎈题目链接🎈🎈-------------------
解法1
如果是一个集合来求组合的话,就需要startIndex
例如:77.组合 (opens new window),216.组合总和III (opens new window)。
如果是多个集合取组合,各个集合之间相互不影响,那么就不用startIndex
例如:17.电话号码的字母组合
1
对于ArrayList 移除最后一个元素!!!!
arr.removeLast()
或者arr.remove(arr.size()-1)
2
更新加入到result中时,要注意加入的数组需要深拷贝!!!!!!
result.add(new ArrayList<>(resultgroup));
class Solution {
List<List<Integer>> result = new ArrayList<>();
public List<List<Integer>> combinationSum(int[] candidates, int target) {
Arrays.sort(candidates);
backtracking(candidates,target,0);
return result;
}
int sum = 0;
List<Integer> resultgroup = new ArrayList<>();
public void backtracking(int[] candidates, int target,int begin){
// 终止条件
if(sum == target){
result.add(new ArrayList<>(resultgroup));
return;
}
for(int i = begin; i < candidates.length; i++){
if(sum+candidates[i]>target) continue;
sum = sum+candidates[i];
resultgroup.add(candidates[i]);
backtracking(candidates,target,i);// 递归
resultgroup.removeLast(); // 回溯
sum = sum-candidates[i];
}
}
}