java数据结构与算法刷题目录(剑指Offer、LeetCode、ACM)-----主目录-----持续更新(进不去说明我没写完):https://blog.youkuaiyun.com/grd_java/article/details/123063846 |
---|
文章目录
解题思路 |
---|
此题为216题的前置题,虽然题目整体难度更为简单,但是递归的逻辑却比216题绕。所以先掌握216题。使用216题的思路,可以轻松解决本题
- 典型的回溯算法题
- 对于每个值,我们都有两种选择,选择这个值作为本次组合,进入下一个值的枚举
- 或者进入第二个选项,不选择这个值参与本次组合,跳过当前值
🏆LeetCode216. 组合总和 IIIhttps://blog.youkuaiyun.com/grd_java/article/details/136566739 |
---|
代码 |
---|
class Solution {
List<List<Integer>> lists;//答案保存的地方
int length,target;//题目给的数组长度和目标值
int[] candidates;//题目给的数组
public List<List<Integer>> combinationSum(int[] candidates, int target) {
lists = new ArrayList<List<Integer>>();
length = candidates.length;
this.target = target;
this.candidates = candidates;
//records用于保存当前处理的组合
Integer[] records = new Integer[target];
backTracking(0,0,records,0);//回溯算法
return lists;
}
/**
*
* @param row records数组下标,当前枚举的是组合中的第几个数
* @param sum 当前records中的数字总和
* @param records 保存当前枚举的组合
* @param index 题目所给数组的下标,代表我们可以选用的值是哪个
*/
public void backTracking(int row,int sum,Integer[] records,int index){
if(index >= length) return;//如果下标越界就返回
else if(sum > target) return;//枝剪操作,如果当前sum已经超过target,再往后枚举只会更大
else{
records[row] = candidates[index];//让当前index位置,参与当前组合
int curSum = sum+candidates[index];//计算当前sum值
if(curSum == target){//如果满足条件
ArrayList<Integer> integers = new ArrayList<>();
for(int i = 0;i<=row;i++) integers.add(records[i]);
lists.add(integers);//保存这个答案
}else{//还不够target的值,就继续向后找
//选择当前index位置的值参与组合
backTracking(row+1,curSum,records,index);//下次依然先选择index位置
//进入下次后,若继续选index不满足,就向下走,这次不选择当前index,选index+1.
}
//跳过当前值
//因为是递归,当执行到这里的时候,一定是最后一个进栈的先执行
//也就是我们前面一直说的,“下次”先选择index位置,
//到了这里说明我们现在就是这个“下次”.所以,这里不再使用index,用index+1
backTracking(row,sum,records,index+1);//不选择当前index位置值参与组合
}
}
}