LeetCode-40-组合总和 II

【中等】力扣算法题解析LeetCode40:组合总和 II 本文介绍了求解组合总和问题的回溯算法。给定候选数组和目标值,需找出所有和为目标的唯一组合,每个数字仅用一次。通过排序预处理和回溯剪枝,避免重复组合:排序后跳过同层重复元素,递归时从下一索引开始确保数字不重复使用。Java实现中,使用backtrack函数遍历候选值,通过剪枝优化效率(和超过目标或重复元素时跳过)。 阅读详情

题目

<中等> 组合总和 II
来源:LeetCode.

给定一个候选人编号的集合 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]
]

提示:

  • 1 < = c a n d i d a t e s . l e n g t h < = 100 1 <= candidates.length <= 100 1<=candidates.length<=100
  • 1 < = c a n d i d a t e s [ i ] < = 50 1 <= candidates[i] <= 50 1<=candidates[i]<=50
  • 1 < = t a r g e t < = 30 1 <= target <= 30 1<=target<=30

接下来看一下解题思路:
参考 回溯算法 + 剪枝

思路:回溯:

    与 组合之和 的差别在于:

  • 组合之和 :candidates 中的数字可以无限制重复被选取;
  • 本题: candidates 中的每个数字在每个组合中只能使用一次。
如何去掉重复的元素

在这里插入图片描述
在这里插入图片描述
    数组 candidates 有序,也是 回溯 过程中实现「剪枝」的前提。
    将数组先排序的思路来自于这个问题:去掉一个数组中重复的元素。很容易想到的方案是:先对数组 升序 排序,重复的元素一定不是排好序以后相同的连续数组区域的第 1 1 1 个元素。
    也就是说,剪枝发生在:同一层数值相同的结点第 2 2 2、 3 3 3 … 个结点,因为数值相同的第 1 1 1 个结点已经搜索出了包含了这个数值的全部结果,同一层的其它结点,候选数的个数更少,搜索出的结果一定不会比第 1 1 1 个结点更多,并且是第 1 1 1 个结点的子集。

class Solution {
    public List<List<Integer>> combinationSum2(int[] candidates, int target) {
        List<List<Integer>> result = new ArrayList<>();
        List<Integer> combine = new ArrayList<>();
        if (candidates.length <= 0) {
            return result;
        }
        // 排序
        Arrays.sort(candidates);
        dfs(candidates, target, result, combine, 0);
        return result;
    }
    void dfs(int[] candidates, int target, List<List<Integer>> result, List<Integer> combine, int begin) {
        if (target == 0) {
            result.add(new ArrayList<>(combine));
            return;
        }

        for (int i = begin; i < candidates.length; ++i) {
            // 大剪枝:减去 candidates[i] 小于 0,减去后面的 candidates[i + 1]、candidates[i + 2] 肯定也小于 0,因此用 break
            if (target - candidates[i] < 0) {
                break;
            }
			// 小剪枝:同一层相同数值的结点,从第 2 个开始,候选数更少,结果一定发生重复,因此跳过,用 continue
            if (i > begin && candidates[i] == candidates[i - 1]) {
                continue;
            }

            combine.add(candidates[i]);
            // 因为元素不可以重复使用,这里递归传递下去的是 i + 1 而不是 i
            dfs(candidates, target - candidates[i], result, combine, i + 1);
            combine.remove(combine.size() - 1);
        }
    }
}
避免重复的思想:

    可以让同一层级,不出现相同的元素,但是父子结构可以出现相同的结构。同一层级相同的元素,表示同一个元素多次使用,父子结构相同的元素,表示同等的不同元素。
    避免重复的是这条语句:

i > begin && candidates[i] == candidates[i - 1]
  • 在一个for循环中,所有被遍历到的数都是属于一个层级的。我们要让一个层级中,
    必须出现且只出现一个2,那么就放过第一个出现重复的2,但不放过后面出现的2。
    第一个出现的2的特点就是 i == begin. 第二个出现的 2 特点是 i> begin.
  • 首先 c a n d i d a t e s [ i ] = = c a n d i d a t e s [ i − 1 ] candidates[i] == candidates[i - 1] candidates[i]==candidates[i−1] 是用于判定当前元素是否和之前元素相同的语句。
(详细教程)opencv+pycharm+笔记本摄像头 做一个人脸识别 文章目录 前言 一、pandas是什么? 二、使用步骤 1.引入库 2.读入数据 总结 一、安装opencv-python 这里推荐使用pycharm直接安装opencv-python 打开文件——设置——python解释器——点击+号 搜索opencv-python,点击安装包,等待片刻即可安装好 检查是否安装好,新建一个项目输入以下代码,若无报错则安装好 import cv2 二、准备分类器 咱们使用opencv官方提供的分类器,包括面部识别,侧... 阅读详情

相关推荐

数分实战(01):Global_Superstore数据集解析与商业洞察

本文以Global_Superstore零售数据集为例,手把手指导数据分析实战全流程。从数据清洗、探索性分析到深度商业洞察,详细解析了如何通过Python处理缺失值与异常值,进行销售利润分析、客户细分与地理分析,并探讨了折扣与利润的微妙关系。文章旨在帮助读者建立数据分析思维框架,从数据中挖掘可指导实际业务决策的核心洞察。

weixin_28487433的博客 342

LeetCode 力扣 40. 组合总和 II

题目描述(中等难度) 和上一道题非常像了,区别在于这里给的数组中有重复的数字,每个数字只能使用一次,然后同样是给出所有和等于 target 的情况。 解法一 回溯法 只需要在上题的基础上改一下就行了。直接看代码吧。 public List<List<Integer>> combinationSum2(int[] candidates, int target) { ...

wind_liang的博客 1088

【游戏开发】初识寻路&navmesh,探索RecastDemo

在手游时代,尤其对于大世界游戏而言,寻路的实现基本在专门的寻路服务器上进行。在众多寻路的解决方案中,recastnavigation是最为经典实用的一个,很多游戏甚至游戏引擎都采用类似的实现。recastnavigation项目自带了RecastDemo,用图形化的界面帮助用户认识寻路网格(navmesh)的生成以及寻路的过程。因此,作为初学者的笔者,也决定通过RecastDemo去初步认识寻路的机理奥秘。 构建RecastDemo 首先克隆recastnavigation项目,从文档中可以看到Recast

HiKariのTechLab 3050

40. 组合总和 II(力扣LeetCode)

给定一个候选人编号的集合 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。输入: candidates = [10,1,2,7,6,1,5], target = 8,输入: candidates = [2,5,2,1,2], target = 5,candidates 中的每个数字在每个组合中只能使用 一次。注意:解集不能包含重复的组合。

m0_73841621的博客 701

STM32H7+LAN8720A之ETH与LWIP配置问题(End)

开篇介绍 由于项目中需要使用到STM32H7系列的芯片,且该系列无法移植ST的标准库,只能使用ST的HAL库,通过STM32Cube生成HAL库的基本代码。在项目开发中需要使用到STM32板载的ETH口,在简化的四层模型中充当着数据链路层的角色,我们只需添加PHY并配置好IP,即可实现基本的TCP主从机通信、UDP通信等等。 一、激光雷达3i-T1 由于使用了一款只具有网口通信的单线激光雷达,其具有TCP和UDP方式的通信方式,为了避免进行TCP中的socket报文解析和繁琐的通信握手过程,我们首先将雷达配

weixin_42024702的博客 1万+

数据中心GPU芯片性能参数速查表(Nvidia+国产算力卡)

本文提供了一份数据中心GPU芯片性能参数速查表,涵盖Nvidia与国产算力卡两大阵营。文章详细解读了算力、显存、互连技术及功耗等关键性能指标,并对比了A100、H100、昇腾910B等主流型号,旨在帮助用户根据AI训练、推理等实际场景,做出高效的硬件选型与成本评估决策。

a0b1c2d3的专栏 835

LeetCode 40. 组合总和 II

组合、深度优先搜索 + 剪枝

英雄哪里出来 567

个人信息保护合规审计人员(高级)能力考核试卷+面试模拟

《个人信息保护合规审计考试与面试指南》 摘要:本文提供个人信息保护合规审计考试及面试的全面指导。考试采用闭卷笔试形式,满分100分,合格线75分,时长120分钟,包含单选、多选、判断题及综合案例分析题。内容涵盖《个人信息保护法》核心条款、审计程序、风险评估等实务要点。面试环节采用情景模拟方式,重点考察应试者在压力下处理审计独立性、客户关系与监管要求的平衡能力,以及应对数据泄露等突发事件的处置流程。案例题聚焦大型互联网平台的数据收集、共享、跨境传输等高风险环节的合规审计,要求设计完整的审计方案框架。面试评分标

qq_41525079的博客 1142

力扣:40. 组合总和 II

【回溯算法中的去重,树层去重树枝去重,你弄清楚了没?| LeetCode:40.组合总和II】中的每个数字在每个组合中只能使用。给定一个候选人编号的集合。解集不能包含重复的组合。中所有可以使数字和为。

icbbm的博客 506

【ComfyUI】SDXL + 单LoRA 房屋平面图渲染装修

本文介绍了一种基于ComfyUI的室内平面设计图自动生成效果图的工作流。该流程通过导入房屋平面图,结合SDXL室内设计模型与北欧风格LoRA模块,快速生成多房间效果展示。工作流包含图像输入、文本处理、模型加载和图像生成等环节,支持风格化渲染和细节补充,适用于建筑设计、家装展示、房地产营销等场景。核心采用SDXL通用室内设计模型和北欧极简LoRA,通过节点衔接实现自动化批量生成,能在短时间内将平面方案转化为逼真的三维效果图。该技术可提升设计呈现效率,辅助客户决策,并应用于教学研究领域。

Mr数据杨 3648

使用微信小程序开发制作一个简单的在线问答应用

以上就是一个简单的在线问答小程序的开发过程。其中包括前端界面的布局和逻辑,后端接口的设计和实现,以及部署和测试的步骤。通过以上步骤,你可以自己尝试开发一个类似的在线问答应用。

2401_85258012的博客 791

LeetCode40-组合总和 II

LeetCode40-组合总和 II 给定一个数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。 candidates 中的每个数字在每个组合中只能使用一次。 说明: 所有数字(包括目标数)都是正整数。 解集不能包含重复的组合。 示例 1: 输入: candidates = [10,1,2,7,6,1,5], ta...

lyd1995的博客 175

[23]-->变长SPI接口

然而,FPGA技术复杂,学习门槛较高,许多人(初学者或学生)在学习过程中面临诸多挑战。(1)模式0:SCK串行时钟线空闲是为低电平,数据在SCK时钟的上升沿被采样,数据在SCK时钟的下降沿切换,CPOL= 0,CPHA=0;(2)模式1:SCK串行时钟线空闲是为低电平,数据在SCK时钟的下降沿被采样,数据在SCK时钟的上升沿切换,CPOL= 0,CPHA=1;(3)模式3:SCK串行时钟线空闲是为高电平,数据在SCK时钟的上升沿被采样,数据在SCK时钟的下降沿切换,CPOL= 1,CPHA=1;

m0_46498597的博客 178

LeetCode第40题_组合总和II

给定一个候选人编号的集合 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。candidates 中的每个数字在每个组合中只能使用。解集不能包含重复的组合。

qq_40263592的博客 1139

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

leetcode40-组合总和II

leetcode40-组合总和III

weixin_45799371的博客 724

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

Leetcode刷题笔记 40. 组合总和 II

40. 组合总和 II 时间:2020年9月10日 知识点:回溯 题目链接:https://leetcode-cn.com/problems/combination-sum-ii/ 题目 给定一个数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。 candidates 中的每个数字在每个组合中只能使用一次。 说明: 所有数字(包括 target)都是正整数。 解集不能包含重复的组合。 示例1 输入: candidates = [

cjl的博客 383

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

#力扣LeetCode40. 组合总和 II @FDDLC

题目描述: 40. 组合总和 II - 力扣(LeetCode) (leetcode-cn.com) 自测用例: [10,1,2,7,6,1,5] 8 [2,5,2,1,2] 5 [1,1,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,3,3,3,3,3,3,4,4,4,4] 5 Java代码: class Solution { List<List<Integer>> ans=new LinkedList<>();

LiuXingchang的博客 350

LeetCode 40 组合总和 II dfs

// 跟上题类似,只是需要去重方面考虑的多一些 // 开始暴力去重,发现效率很低... // 后来参考大牛们的博客才发现,原来只要在每次递归的时候 // 就可以去重,比如: // 1 1 2 2 3 // 1放入 ,第二个1在这轮循环中不需要再放入,注意是这轮循环 // 递归不到家....哎...继续加油! class Solution { boolean[] flag = nul...

TIMELIMITE的专栏 293

LeetCode40 组合总和 II(java实现)

LeetCode40 组合总和 II 给定一个数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。 candidates 中的每个数字在每个组合中只能使用一次。 说明: 所有数字(包括目标数)都是正整数。 解集不能包含重复的组合。 示例 1: 输入: candidates = [10,1,2,7,6,1,5], t...

大白菜的博客 304

LeetCode-40. 组合总和 II【数组 回溯】

这意味着在某轮选择中,若当前元素与其左边元素相等,则说明它已经被选择过,因此直接跳过当前元素。例如,给定数组 [4, 4^ ,5] 和目标元素 9 ,则现有代码的输出结果为 [4,5],[ 4^ ,5] ,出现了重复子集。如下图所示,第一轮共有三个选择,其中两个都为 4 ,会产生两个重复的搜索分支,从而输出重复子集;输入: candidates = [10,1,2,7,6,1,5], target = 8,输入: candidates = [2,5,2,1,2], target = 5,

zik的博客 1219

LeetCode-40. 组合总和 II

题目描述(中等难度) 解题思路 使用递归求解,递归的过程其实就是一个选数的过程,只要递归过程中,所选数的和不超过目标数 target,就把所选的数保存到临时列表中。一旦所选数的和等于 target,就将临时列表加入结果集。 public static List<List<Integer>> combinationSum2(int[] candidates, int target) { List<List<Integer>> ll =

渣渣 472

【Leetcode】40. 组合总和 II

题目描述 给定一个数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。 candidates 中的每个数字在每个组合中只能使用一次。 注意:解集不能包含重复的组合。 题解 我们可以看这道题的前身【Leetcode】39. 组合总和,candidates中的元素是可以重复使用的,但是在这里不行。共同点是,组合本身不能重复。 不重复取元素对象在回溯搜索里,可以通过安排for循环的起点来实现。但是如果candidates本身存在重复数

锥栗的博客 4422

ii 组合总和_LeetCode 力扣 40. 组合总和 II

题目描述(中等难度)和上一道题非常像了,区别在于这里给的数组中有重复的数字,每个数字只能使用一次,然后同样是给出所有和等于 target 的情况。解法一 回溯法只需要在上题的基础上改一下就行了。直接看代码吧。public List> combinationSum2(int[] candidates, int target) {List> ans = new ArrayList<&...

weixin_39734074的博客 229

Leetcode40. 组合总和 II

Leetcode40. 组合总和 II class Solution { List<List<Integer>> result = new ArrayList<>(); List<Integer> path = new ArrayList<>(); public List<List<Integer>> combinationSum2(int[] candidates, int target) {

Loser_you的博客 137

LeetCode40——组合总和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: 输入: cand

weixin_38933749的博客 316

力扣第40题 中等难度 组合总和II

题目:和39题一样,区别在于每个数在每一组里只能使用一次 思路: 学习第39题的思路,采用递归回溯的方法 需要注意(1,2,7)和(7,2,1)其实属于同一种解,因此如果出现了第二个解的时候,要对其进行排序,排序后判断是否和第一个解一样,如果一样就不放入结果数组。 代码: //40.组合总和II public class Solution40 { public List<List<Integer>> combinationSum2(int[] candidates, int

加文斯利的博客 297
上一篇: LeetCode-39 - 组合总和
下一篇: LeetCode-41-缺失的第一个正数
CodAlun
博客等级 码龄8年 46粉丝 96原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值