leetcode:40.组合总和 II

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

题目描述:


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


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


说明:


  • 所有数字(包括目标数)都是正整数。
  • 解集不能包含重复的组合。


示例1:


输入: candidates = [10,1,2,7,6,1,5], target = 8,
所求解集为:
[
  [1, 7],
  [1, 2, 5],
  [2, 6],
  [1, 1, 6]
]


示例2:


输入: candidates = [2,5,2,1,2], target = 5,
所求解集为:
[
  [1,2,2],
  [5]
]


题目难度:中等


分析:


这一题和上一题唯一的区别就是数组中的元素不可以重复使用,解题的思路是先排序,然后穷举,同时利用Set去重即可。


代码如下:


class Solution {
    public List<List<Integer>> combinationSum2(int[] candidates, int target) {
      // 用Set来去重
        Set<List<Integer>> res = new HashSet<>();
        List<Integer> list = new ArrayList<>();
        // 排序过的元素才可以去重
        Arrays.sort(candidates);
        if (candidates.length == 0) {
            return new ArrayList<>();
        }
        combinationSumHelp(res, list, candidates, target, 0);
        return new ArrayList<>(res);
    }
    /**
     * @param res 结果集
     * @param list 结果集中的集合
     * @param candidates 数组
     * @param target 目标数
     * @param start 开始递归的下标
     */
    private void combinationSumHelp(Set<List<Integer>> res, List<Integer> list, int[] candidates, int target,
                                       int start) {
        if (target == 0) {
            List<Integer> temp = new ArrayList<>(list);
            res.add(temp);
        } else if (target > 0) {
            for (int i = start; i < candidates.length; i++) {
                list.add(candidates[i]);
                combinationSumHelp(res, list, candidates, target - candidates[i], i + 1);
                list.remove(list.size() - 1);
            }
        }
    }
}


总结:


可以使用Set进行去重。递归要注意结束条件,否则会死循环。

目录
相关文章
|
数据可视化 Ubuntu 机器人
WebViz可视化工具的应用
【10月更文挑战第2天】WebViz可视化 Webviz是一个基于Web的可视化工具,意味着您可以通过浏览器/APP访问它,而不需要安装额外的软件。这对于远程访问和团队协作非常方便。 Foxglove是一个开源的工具包,包括线上和线下版。旨在简化机器人系统的开发和调试。它提供了一系列用于构建机器人应用程序的功能。 本节将介绍如何使用Foxglove进行数据查看,以及话题通信。 为了实现OriginBot与Foxglove的连接,我们需要在OriginBot上搭建ROS环境。请确保您的机器人是OriginBot(视觉版/导航版),并且您的PC运行的是Ubuntu(≥20.04)或Win
325 1
|
缓存 关系型数据库 MySQL
Django操作MySQL数据库的优化方法
Django操作MySQL数据库的优化方法
377 0
|
SQL 大数据 数据处理
一文搞懂连续问题
**SQL面试中,连续问题涉及窗口函数如row_number()、lag()、sum()over(order by)等,旨在测试综合能力。关键在于特定分组下,为连续内容分配相同分组ID。解题通常分为判断连续条件和后续处理两步。双排序差值法和累积求和法是常见策略。举例来说,连续登录天数、连续点击次数等题目,会在得到分组ID后用聚合函数统计分析。题目难度逐步升级,涉及销售额增长、时间间隔、涨幅条件等,要求灵活应用并处理复杂逻辑。**
|
SQL 开发者
访问者模式问题之FunctionExtractor是怎么工作的,以从SqlNode中提取函数名称的
访问者模式问题之FunctionExtractor是怎么工作的,以从SqlNode中提取函数名称的
|
人工智能 运维 数据可视化
易云维提出了工厂能耗管理平台系统方案,广东制造业按下低碳发展的快进键
我国《关于完整准确全面贯彻新发展理念推进碳达峰碳中和工作的实施意见》出台,提出了推进碳达峰碳中和工作的总体目标。到2025年,广东具备条件的地区、行业和企业率先实现碳达峰,为全省实现碳达峰、碳中和奠定坚实基础;2030年前实现碳达峰,达峰后碳排放稳中有降;到2050年,以新能源为基础的新型电力体系全面建成,能源综合利用效率达到国际先进水平;到2060年,绿色低碳循环的经济体系和清洁低碳安全高效的能源体系全面建成,碳中和目标顺利实现,生态文明高度发达,开创人与自然和谐共生新境界。
288 0
|
消息中间件 大数据 Kafka
别找了,Kafka视频、书、面试题全给你准备好了~~
别找了,Kafka视频、书、面试题全给你准备好了~~
|
数据可视化 JavaScript
可视化拖拽组件库一些技术要点原理分析(四)(上)
可视化拖拽组件库一些技术要点原理分析(四)
227 0
可视化拖拽组件库一些技术要点原理分析(四)(上)
|
Scala 索引 容器
四天掌握Scala(4)
你好看官,里面请!今天笔者讲的是scala。不懂或者觉得我写的有问题可以在评论区留言,我看到会及时回复。 注意:本文仅用于学习参考,不可用于商业用途,如需转载请跟我联系。
185 1
四天掌握Scala(4)
|
存储
指针的使用
指针的使用
152 0