【组合递归回溯】【removeLast】Leetcode 39. 组合总和

本文介绍了解决LeetCode39题——组合总和的递归回溯方法,涉及ArrayList移除最后一个元素、深度复制以及如何在满足目标值时进行回溯。
摘要由CSDN通过智能技术生成

【组合递归回溯】【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];
        }
    }
}    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值