LeetCode--39.组合总和、40组合总和II

2023-11-06

39.组合总和

题目描述

给定一个无重复元素的数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。candidates 中的数字可以无限制重复被选取。说明:所有数字(包括 target)都是正整数。解集不能包含重复的组合。
示例 1:输入:candidates = [2,3,6,7], target = 7,
所求解集为:
[
[7],
[2,2,3]
]
示例 2:输入:candidates = [2,3,5], target = 8,
所求解集为:
[
[2,2,2,2],
[2,3,3],
[3,5]
]
提示:1 <= candidates.length <= 301 <= candidates[i] <= 200candidate 中的每个元素都是独一无二的。1 <= target <= 500

解题思路

理清题目。算法思想:回溯。算法结构:递归。
1.先对数组做一个升序排序,本意是求相加等于target,换一种思路就是减法的思想,用target一个一个减去数组里的元素,当等于零时就是一组答案,这里选择从大的数开始减,即从数组最后一个元素开始减。
2.既然用到递归,那么就得有递归结束判断条件,否则就会进入死循环。
用target挨个减的过程中,会有大于零、等于零、小于零的结果。
 a.如果等于零,则找到一组答案,然后return即可结束。(结束条件1)
 b.如果小于零,因为是排好序的数组,再往下找也不会有答案,直接return结束。(结束条件2)
 c.如果大于零,那么继续递归。

代码(java)

class Solution {
    List<List<Integer>> ans = new ArrayList<>();//全局
    public List<List<Integer>> combinationSum(int[] candidates, int target) {
        List<Integer> list = new ArrayList<>();//用于存储每一个符合的集合
        Arrays.sort(candidates);
        dfs(candidates.length - 1, target, candidates, list);
        return ans;
    }
    void dfs(int star, int target, int[] nums, List<Integer> list) {
        if (target < 0)
            return;
        else if (target == 0) {
            ans.add(new ArrayList<>(list));
            return;
        } else {
            for (int i = star; i >= 0; i--) {
                if (target < nums[i])
                    continue;
                list.add(nums[i]);
                dfs(i, target - nums[i], nums, list);//每一个元素可重复使用,继续从该元素开始
                list.remove(list.size() - 1);//target值小于零return之后,回到上一节点并去掉该节点
            }
        }
    }
}

40.组合总和II

题目描述

给定一个数组 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]
]

解题思路

分析题目,可以看出此题与上一题大同小异,把上一题代码修改即可。不同的地方在于,1.每一个数只能使用一次,不能重复使用;2.数组中可能包含重复数据。
单看第一点,既然数组元素不能重复使用,那么在递归时就让它从下一个元素开始,代码修改:

//原来递归从i开始
 dfs(i, target - nums[i], nums, list)
//参数修改为下一个开始遍历,i-1
 dfs(i-1, target - nums[i], nums, list)

然后看第二点,数组中可能包含相同元素,当前代码会出现的bug:
bug1.例如示例 1:输入: candidates = [10,1,2,7,6,1,5], target = 8,
排好序后candidates = [1,1,2,5,6,7,10]
解集candidates[0],candidates[2],candidates[3]即[1,2,5]
解集candidates[1],candidates[2],candidates[3]即[1,2,5]导致重复。
首先想到的解决方法是加一个判定条件,让它跳过该层循环进入下一层循环

 if (nums[i] == nums[i + 1])                    
     continue;

然而此时第二个bug出现,
bug2.会错失统计解集candidates[0],candidates[1],candidates[4],[1,1,6]
盗用一个非常完美的解答:同层去重
在这里插入图片描述
于是代码修改为:

if (i < star && nums[i] == nums[i + 1])
    continue;
    //i是当前考察的元素下标,start是本层最开始的那个元素的下标

代码(java)

class Solution {
    List<List<Integer>> ans = new ArrayList<>();
    public List<List<Integer>> combinationSum2(int[] candidates, int target) {
        List<Integer> list = new ArrayList<>();
        Arrays.sort(candidates);
        dfs(candidates.length - 1, target, candidates, list);
        return ans;
    }
    void dfs(int star, int target, int[] nums, List<Integer> list) {
        if (target < 0)
            return;
        else if (target == 0) {
            ans.add(new ArrayList<>(list));
        } else {
            for (int i = star; i >= 0; i--) {
                if (target < nums[i])
                    continue;
                if (i < star && nums[i] == nums[i + 1]) //i是当前考察的元素下标,start是本层最开始的那个元素的下标
                    continue;
                list.add(nums[i]);
                dfs(i-1, target - nums[i], nums, list);//参数修改为下一个开始遍历,i-1
                list.remove(list.size() - 1);
            }
        }
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

LeetCode--39.组合总和、40组合总和II 的相关文章

随机推荐

  • SPDK块设备

    SPDK视角每个App由多个子系统 subsystem 构成 同时每个子系统又包含多个模块 module 子系统和模块的注入都是可插拔的 通过相关的宏定义声明集成到SPDK组件容器里 其中子系统的注入可通过声明SPDK SUBSYSTEM
  • MMDeploy部署实战系列【第一章】:Docker,Nvidia-docker安装

    MMDeploy部署实战系列 第一章 Docker Nvidia docker安装 这个系列是一个随笔 是我走过的一些路 有些地方可能不太完善 如果有那个地方没看懂 评论区问就可以 我给补充 版权声明 本文为博主原创文章 遵循 CC 4 0
  • Type cannot use 'try' with exceptions disabled

    cannot use throw with exceptions disabled 在为 DragonBonesCPP refactoring 的 cocos2d x 3 2 demo 增加 Android 编译时 NDK 报了一个编译错误
  • 数据结构刷题训练营1

    开启蓝桥杯备战计划 每日练习算法一题 坚持下去 想必下一年的蓝桥杯将会有你 笔者是在力扣上面进行的刷题 由于是第一次刷题 找到的题目也不咋样 所以 就凑合凑合吧 笔者打算从数据结构开始刷起 毕竟现在刚刚接触到数据结构 在力扣上找到的刷题链接
  • 计算机方面英语文献翻译(学习记录更新中)

    在万方找的英文文献摘要 自己翻译的 1 考虑到时间序列数据的高维度和复杂性给数据挖掘带来的困难以及聚类分析在时间序列数据挖掘领域中的重要性 本文总结了国内外时间序列数据聚类的研究现状 时间序列聚类可以被分为全时间序列聚类和子序列聚类 并且可
  • Python流体动力学共形映射库埃特式流

    流体动力学简述 在物理学和工程学中 流体动力学是流体力学的一个分支学科 它描述了流体 液体和气体的流动 它有几个子学科 包括空气动力学 研究空气和其他运动中的气体 和流体动力学 研究运动中的液体 流体动力学具有广泛的应用 包括计算飞机上的力
  • 携程酒店数据爬取2020.5

    携程酒店数据爬取2020 5 1 开题 目前网上有好多爬取携程网站的教程 大多数通过xpath beautifulsoup 正则来解析网页的源代码 然后我这个菜b贪方便 直接copy源码的xpath paste在xpath helper改改
  • Kaggle手势符号识别项目实战

    项目数据集地址 https www kaggle com datasets ardamavi sign language digits dataset 观察到数据集已经做过预先的整理 十分工整 txt文件中类别标记清晰详细 项目文件如上图所
  • 小程序+单页+需要服务器,小程序单页设计

    小程序单页设计 内容精选 换一换 I O分析以存储块设备为分析对象 分析得出块设备的I O操作次数 I O数据大小 I O队列深度 I O操作时延等性能数据 并关联到造成这些I O性能数据的具体I O操作事件 进程 线程 调用栈 应用层I
  • iOS自动化布局-AutoLayout约束优先级

    约束的优先级 AutoLayout添加的约束中也有优先级 Priority 优先级的数值1 1000 分为两种情况 一种情况是我们经常添加的各种约束 默认值1000 最大值 优先执行 条件允许的话系统会自动满足我们的约束需求 第二种就是固有
  • 学习OpenCV:rotatedRectangleIntersection计算两个旋转矩形的交集面积

    如图所示 计算两个旋转矩形相交重合区域的顶点 最多返回8个顶点 通过contourArea可返回该顶点集合的面积 void DrawPointSet Mat imgInoutput vector
  • 区块链扫盲之私钥、公钥和地址

    公开密钥 public key 简称公钥 私有密钥 private key 简称私钥 是密码学里非对称加密算法的内容 顾名思义 公钥是可以公开的 而私钥则要进行安全保管 私钥是由随机种子生成的 公钥是将私钥通过算法推导出来 由于公钥太长 为
  • python socket编程之tcp协议多客户端连接

    1 socket 介绍 socket 原意插座 插孔 计算机中一般称为套接字 在同一台计算机中的两个程序可以通过文件 管道 队列等方式进行通信 但是在网络中 两台计算机之间的通讯就需要依靠socket进行通信 2 socket之tcp协议
  • 利用Anaconda完成Python环境安装及配置

    1 Anaconda 1 1 配置过程 Anaconda是一个开源的Python和R编程语言的软件包管理器和环境管理器 用于数据科学和机器学习的开发 进入官网https www anaconda com 下载安装包 next gt arge
  • Host is not allowed to connect to this MySQL server

    意思其实就是我们的MySQL不允许远程登录 所以远程登录失败了 解决方法如下 1 在装有MySQL的机器上登录MySQL mysql u root p密码 2 执行use mysql 3 执行update user set host whe
  • matlab神经网络

    Solve an Input Output Fitting problem with a Neural Network Script generated by Neural Fitting app Created 03 Jan 2022 1
  • vue的常用基础知识

    哈喽 今天不加班 回来整理一下以前的旧笔记 给你们分享一波基础知识 1 Vue模板的使用 div msg vue中的data又属性值 1 2 4 7 5 isShow 真好看 真丑 parseInt 10 2345 div 里面可以写任意j
  • 数据库操作入门速查(1)——Access数据库简单访问

    引用 using System Data OleDb 编写代码 string s Provider Microsoft Jet OLEDB 4 0 Data Source D student zws20151389047 EX1 Datab
  • 启动mongoDB服务

    打开计算机服务 查看mongoDB服务是否已经启动 如果没有自动启动 右键手动启动一下 即可 安装过程中 经常出现一个问题 服务无法自动创建启动 去bin目录下启动mongod exe 提示丢失文件 需要下载安装 去微软官网下载安装 Vis
  • LeetCode--39.组合总和、40组合总和II

    LeetCode 39 组合总和 40组合总和II做题笔记 39 组合总和 题目描述 解题思路 代码 java 40 组合总和II 题目描述 解题思路 代码 java 39 组合总和 题目描述 给定一个无重复元素的数组 candidates