leetcode-40:组合总和 II

简介: leetcode-40:组合总和 II

题目

题目链接

给定一个数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。

candidates 中的每个数字在每个组合中只能使用一次。

注意:解集不能包含重复的组合。

示例 1:

输入: candidates = [10,1,2,7,6,1,5], target = 8,
输出:
[
[1,1,6],
[1,2,5],
[1,7],
[2,6]
]

示例 2:

输入: candidates = [2,5,2,1,2], target = 5,
输出:
[
[1,2,2],
[5]
]

解题

本题目要求解集中不能包含重复组合

比如输入: candidates = [2,5,2,1,2], target = 5,
不能同时出现[2,2,1]和[2,1,2]

所以要排序candidates=[1,2,2,2,5];

其次,可以把回溯看成一个N叉树,横向就是for循环,纵向就是递归

横向不能取重复元素,纵向可以取重复元素

为了使得横向不能取if( i>0&&candidates[i]==candidates[i-1]) continue;

但是这样会把纵向的重复也给去掉了

也就是说纵向的i=startIndex可以取,

下图中,不同颜色,代表不同递归层次(纵向)。相同的颜色,代表同一个for循环(横向)

所以只需要if(i>startIndex&&candidates[i]==candidates[i-1]) continue;,就可以使得横向去重,纵向不去重

class Solution {
public:
    vector<vector<int>> res;
    vector<int> path;
    void backtracing(vector<int>& candidates,int target,int sum,int startIndex){
        if(sum==target){
            res.push_back(path);
            return;
        }
        else if(sum>target) return;
        for(int i=startIndex;i<candidates.size();i++){
            if(i>startIndex&&candidates[i]==candidates[i-1]) continue;
            path.push_back(candidates[i]);
            sum+=candidates[i];
            backtracing(candidates,target,sum,i+1);
            sum-=candidates[i];
            path.pop_back();
        }
    }
    vector<vector<int>> combinationSum2(vector<int>& candidates, int target) {
        sort(candidates.begin(),candidates.end());
        backtracing(candidates,target,0,0);
        return res;
    }
};

方法二:

参考链接

class Solution {
public:
    vector<vector<int>> res;
    vector<int> path;
    void dfs(vector<int>&candidates,int target,vector<bool>& used,int sum,int start){
        if(sum==target){
            res.push_back(path);
            return;
        }
        else if(sum>target) return;
        for(int i=start;i<candidates.size();i++){
            if(i>0&&candidates[i]==candidates[i-1]&&used[i-1]==false) continue;
            sum+=candidates[i];
            used[i]=true;
            path.push_back(candidates[i]);
            dfs(candidates,target,used,sum,i+1);
            path.pop_back();
            used[i]=false;
            sum-=candidates[i];
        }
    }
    vector<vector<int>> combinationSum2(vector<int>& candidates, int target) {
        vector<bool> used(candidates.size(),false);
        sort(candidates.begin(),candidates.end());
        dfs(candidates,target,used,0,0);
        return res;
    }
};

java

class Solution {
    List<List<Integer>> res=new LinkedList<>();
    List<Integer> path=new LinkedList<>();
    void dfs(int[] candidates,int target,boolean[] used,int startIndex,int sum){
        if(sum==target){
            res.add(new LinkedList<>(path));
            return;
        }else if(sum>target) return;
        for(int i=startIndex;i<candidates.length;i++){
            if(i>0&&candidates[i]==candidates[i-1]&&used[i-1]==false) continue;
            path.add(candidates[i]);
            used[i]=true;
            dfs(candidates,target,used,i+1,sum+candidates[i]);
            used[i]=false;
            path.remove(path.size()-1);
        }
    }
    public List<List<Integer>> combinationSum2(int[] candidates, int target) {
        Arrays.sort(candidates);
        boolean[] used=new boolean[candidates.length];
        dfs(candidates,target,used,0,0);
        return res;
    }
}


相关文章
“跨域”问题理解
“跨域”问题理解
255 0
|
8月前
|
人工智能 安全 API
OpenClaw保姆级图文指南!阿里云1分钟部署+免费API配置+12个实用Skill及常见问题解答
OpenClaw的Skills生态正以惊人速度扩张——截至2026年3月,ClawHub已收录15725个技能,覆盖办公、开发、搜索、自动化等全场景。但繁荣背后暗藏风险:ClawHavoc安全事件暴露了严峻问题,12%的Skills存在恶意行为,包括窃取API密钥、后台挖矿、伪装热门工具等,给用户造成隐私泄露与财产损失。
1710 6
|
8月前
|
机器学习/深度学习 传感器 算法
基于融合floyd算法的改进A星算法路径规划Matlab程序
🌿 往期回顾可以关注主页,点击搜索 智能优化算法 神经网络预测 雷达通信 无线传感器 电力系统 信号处理 图像处理 路径规划 元胞自动机 无人机 物理应用 机器学习系列 车间调度系列 滤波跟踪系列 数据分析系列 图像处理系列 ✅作者简介:热爱科研的Matlab仿真开发者,擅长毕业设计辅导、数学建模、数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。 🍎 往期回顾关注个人主页:
243 11
|
11月前
|
机器学习/深度学习 人工智能 运维
主流AI证书深度对比:从入门到进阶,怎么选不踩坑?
随着人工智能技术持续渗透各行各业,“懂AI”已从职业加分项变成不少岗位的基础要求。智联招聘数据显示,72%的AI相关岗位在招聘时会将“持有权威认证”作为筛选硬标准,持证者薪资溢价普遍达20%-35%。但市面上的AI证书五花八门,有国际大厂推出的技术认证,有国内厂商的生态绑定证书,还有适配零基础学习者的通用证书,到底哪款适合自己?本文就为你全面拆解主流AI证书的核心差异,帮你理清选择思路。
|
弹性计算 运维 Java
最佳实践:阿里云倚天ECS在千寻位置时空智能服务的规模化应用
阿里云、平头哥及安谋科技联合举办的飞天技术沙龙探讨了倚天Arm架构在业务创新中的应用。活动中,千寻位置运维专家分享了将核心业务迁移到倚天处理器ECS实例的成功案例,强调了倚天处理器的高能效比和降本增效优势。迁移过程涉及操作系统、CICD系统和监控系统的适配,以及业务系统的性能测试。目前,千寻已迁移了上千台ECS实例到倚天处理器,实现了成本和效率的显著提升。未来计划继续扩展倚天处理器在核心业务和K8S中的应用。
|
存储 缓存 中间件
构建高效RESTful API:最佳实践与技巧
构建高效RESTful API:最佳实践与技巧
|
JavaScript
vue老项目sass和element-ui开发踩坑
公司的一个各种依赖比较老的项目,习惯了之前的iview和stylus开发,刚接手还是有很多不习惯的地方
|
弹性计算 关系型数据库 对象存储
【访问控制】STS接口调用提示权限报错排查思路
本文主要是针对STS接口调用出现的403权限报错提供一些排查思路。 报错:You are not authorized to do this action. You should be authorized by RAM
3038 0
【访问控制】STS接口调用提示权限报错排查思路
|
数据采集 JSON 小程序
【微信小程序】小程序代码基本组成结构
小程序官方建议把所有小程序的页面,都存放在pages目录中,以单独的文件夹存在
484 0
【微信小程序】小程序代码基本组成结构
从开发角度看羊了个羊
从开发角度看羊了个羊
598 0

热门文章

最新文章