java数据结构与算法刷题-----LeetCode39. 组合总和

java数据结构与算法刷题目录(剑指Offer、LeetCode、ACM)-----主目录-----持续更新(进不去说明我没写完):https://blog.youkuaiyun.com/grd_java/article/details/123063846

文章目录

在这里插入图片描述

解题思路

此题为216题的前置题,虽然题目整体难度更为简单,但是递归的逻辑却比216题绕。所以先掌握216题。使用216题的思路,可以轻松解决本题

  1. 典型的回溯算法题
  2. 对于每个值,我们都有两种选择,选择这个值作为本次组合,进入下一个值的枚举
  3. 或者进入第二个选项,不选择这个值参与本次组合,跳过当前值
🏆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位置值参与组合
        }
    }

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ydenergy_殷志鹏

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值