题目描述:
解法:回溯
回溯三个步骤:
- 确定回溯函数返回值(通常是 void),及参数。
- 终止条件。
- 单层遍历逻辑。
本题分析如下 :
1.回溯函数返回值 void,参数需要 int[] nums, int target, int index, int sum;
index 是每次遍历开始位置,因为本题表示每个nums[i]可以被重复利用。
sum 表示当前和。
2.递归终止条件:当 sum > target,return。
当 sum == target 时,添加到返回结果。
3.单层遍历逻辑:for(int i = index; i < nums.length; i++){ if(nums[i] > target) continue; // 不可能的结果 sum += nums[i]; path.add(nums[i]); backtrack(nums, target,sum, i); sum -= nums[i]; //回溯 path.removeLast(); } }
完整代码:
class Solution {
public List<List<Integer>> combinationSum(int[] candidates, int target) {
backtrack(candidates, target, 0, 0);
return rest;
}
List<List<Integer>> rest = new ArrayList<>();
LinkedList<Integer> path = new LinkedList<>();
void backtrack(int[] nums, int target, int sum, int index){
if(sum > target) return;
if(sum == target){
rest.add(new ArrayList<>(path));
return;
}
for(int i = index; i < nums.length; i++){
if(nums[i] > target) continue;
sum += nums[i];
path.add(nums[i]);
backtrack(nums, target,sum, i);
sum -= nums[i];
path.removeLast();
}
}
}