LeetCode:39组合总和

java 复制代码
class Solution {
    List<List<Integer>> res = new ArrayList<>();
    List<Integer> path = new ArrayList<>();
    //实时记录总和
    int sum = 0;

    public List<List<Integer>> combinationSum(int[] candidates, int target) {
        backtrack(candidates, target, 0);
        return res;
    }

    private void backtrack(int[] candidates, int target, int startIndex){
        if(sum > target){
            return;
        }

        if(sum == target){
            res.add(new ArrayList<>(path));
            return;
        }

        //startIndex:防止回头,防止出现2,2,3和3,2,2同时出现的情况
        for(int i = startIndex; i < candidates.length; i++){
            path.add(candidates[i]);
            sum += candidates[i];
            
            //因为元素可以重复,所以这里从i开始
            backtrack(candidates, target, i);

            path.remove(path.size() - 1);
            sum -= candidates[i];
        }
    }
}

对比:

全排列:每次从头挑,没有startIndex,自己不能选自己,需要used数组

子集:每次只能往后挑,不能回头,需要startIndex,拿过一个必须走向下一个(传i+1)

组合总和:每次只能往后挑,不能回头,需要startIndex,但当前可以无限选(传i)

相关推荐
无限进步_2 小时前
【Linux】进程状态、僵尸与孤儿、进程调度
linux·运维·服务器·开发语言·数据结构·算法
郝学胜-神的一滴2 小时前
力扣 662 :二叉树最大宽度
java·数据结构·c++·python·算法·leetcode·职场和发展
仙俊红2 小时前
反射到底解决什么问题?
java·开发语言
2301_764441332 小时前
基于Stackelberg博弈的分散式库存模型
python·算法·数学建模
小森林之主2 小时前
凌晨3点的闹钟:分布式定时任务设计实战
java·redis·任务调度·cron·分布式定时任务
yaoxin5211232 小时前
430. Java 日期时间 API - 时间计算 Temporal 包
java·前端·python
qq 13740186112 小时前
医用无菌屏障系统加速老化标准解读:ASTM F1980-2016 全解析
人工智能·算法·加速老化·包装测试·astm·医疗器械包装·无菌屏障系统
wayz113 小时前
Overlap:SLOPE(线性回归斜率)技术指标详解
算法·金融·数据分析·回归·线性回归·量化交易·特征工程
点云兔子3 小时前
舱口检测:从点云到矩形定位的射线投影算法
opencv·算法·点云·舱口检测