java刷题--39组合总和
Posted Anrys
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java刷题--39组合总和相关的知识,希望对你有一定的参考价值。
题目
代码
class Solution {
List<List<Integer>> res;
public List<List<Integer>> combinationSum(int[] candidates, int target) {
res = new ArrayList<>();
Arrays.sort(candidates);
backtrack(candidates, target, new ArrayList<>(), 0);
return res;
}
private void backtrack(int[] candidates, int remains, List<Integer> path, int start){
if(remains == 0){ // 临界条件
res.add(new ArrayList<>(path));
return;
}
for(int i = start; i < candidates.length; i++){//遍历每一个数
if(candidates[i] > remains) continue;
if(i > 0 && candidates[i] == candidates[i-1]) continue;//两次剪枝
//核心回溯算法代码
path.add(candidates[i]);
backtrack(candidates, remains - candidates[i], path, i);
path.remove(path.size() - 1);
}
}
}
**backtrack的公式**
result = []
def backtrack(路径, 选择列表):
if 满足结束条件:
result.add(路径)
return
for 选择 in 选择列表:
做选择
backtrack(路径, 选择列表)
撤销选择
class Solution {
List<List<Integer>> res = new ArrayList<>();
public List<List<Integer>> combinationSum(int[] candidates, int target) {
Arrays.sort(candidates);
backTrack(candidates, target, 0, new ArrayList<>());
return res;
}
private void backTrack(int[] candidates, int target, int start, ArrayList<Integer> track) {
if (target == 0) {
res.add(new ArrayList<>(track));
return;
}
for (int i = start; i < candidates.length; i++) {
if (target - candidates[i] < 0) break;
track.add(candidates[i]);
backTrack(candidates, target - candidates[i], i, track);
track.remove(track.size() - 1);
}
}
}
结果
以上是关于java刷题--39组合总和的主要内容,如果未能解决你的问题,请参考以下文章