LeetCode 40. 组合总和 II

c语言练习第一天 🌟 前言 今天是C语言每日一练,第1天! 也是我创作的第一篇博客,给大家带来一道c语言题目的思路分析 希望大家多多关注! 1、问题描述 题目传送门 公务员面试现场打分。有7位考官,从键盘输入若干组成绩,每组7个分数(百分制),去掉一个最高分和一个最低分,输出每组的平均成绩。 (注:本题有多组输入) 输入描述: 每一行,输入7个整数(0~100),代表7个成绩,用空格分隔。 输出描述: 每一行,输出去掉最高分和最低分的平均成绩,小数点后保留2位,每行输出后换行 2、题目分析 本题归根结. 阅读详情

一、题目

1、题目描述

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

2、基础框架

  • C++ 版本给出的基础框架代码如下:
class Solution {
public:
    vector<vector<int>> combinationSum2(vector<int>& candidates, int target) {

    }
};

3、原题链接

LeetCode 40. 组合总和 II
LeetCode 剑指 Offer II 082. 含有重复元素集合的组合

二、解题报告

1、思路分析

   ( 1 ) (1) (1) 首先,遇到组合的题,只有两种方案:搜索 和 动态规划。
   ( 2 ) (2) (2) 根据返回值来判断到底是搜索还是动态规划。如果求的是方案数(以及需要模一个数字的情况),那就基本肯定是动态规划;如果求的是所有方案,那基本就是暴力搜索了。
   ( 3 ) (3) (3) 我们看这个题,它是求每种方案,然后再看数据范围,总共 100 100 100 个数,那么每个数能 “取” 或者 “不取”,总共 2 100 2^{100} 2100,复杂度着实堪忧啊。
   ( 4 ) (4) (4) 然后,我们又发现每个数字最小是 1,target只有 30,所以最多选择 30 个数。
   ( 5 ) (5) (5) 于是,果断暴力搜索。
   ( 6 ) (6) (6) 首先,先把数组进行逆序排序,这样就可以从大的开始搜索,加上一些剪枝:
     ( 6.1 ) (6.1) (6.1) 当前和大于target直接返回;
     ( 6.2 ) (6.2) (6.2) 当前和 加上 剩余所有数都小于 target直接返回;
     ( 6.3 ) (6.3) (6.3) 搜索过程中需要去重;

2、时间复杂度

   O ( 2 m ) O(2^m) O(2m),其中 m m m 在本题中其实是 target,最坏的数据就是 100 100 100 个 1,并且 target为 30 的情况。

3、代码详解

class Solution {
    vector<vector<int>> ret;
    vector<int> stk;

    void dfs(vector<int>& candidates, int start, int end, int sum, int target) {
        int i;
        if(sum > target) {
            return ;
        }
        if(sum == target) {
            ret.push_back( stk );
            return ;
        }
        for(i = start; i < end; ++i) {
            if(i > start && candidates[i] == candidates[i-1]) {
                continue;
            }
            stk.push_back( candidates[i] );
            dfs(candidates, i + 1, end, sum + candidates[i], target);
            stk.pop_back();
        }
    }
public:
    vector<vector<int>> combinationSum2(vector<int>& candidates, int target) {
        int i;
        int n = candidates.size();
        ret.clear();
        sort(candidates.begin(), candidates.end(), greater());
        dfs(candidates, 0, n, 0, target);
        sort(ret.begin(), ret.end());
        // 数组去重
        // ret.erase( unique(ret.begin(), ret.end()), ret.end() );
    
        return ret;
    }
};


三、本题小知识

  任何问题,我们都需要考虑极端情况,最坏情况的数据才是这个问题的真正时间复杂度。


四、加群须知

  相信看我文章的大多数都是「 大学生 」,能上大学的都是「 精英 」,那么我们自然要「 精益求精 」,如果你还是「 大一 」,那么太好了,你拥有大把时间,当然你可以选择「 刷剧 」,然而,「 学好算法 」,三年后的你自然「 不能同日而语 」。
  那么这里,我整理了「 几十个基础算法 」 的分类,点击开启:

🌌《算法入门指引》🌌

  如果链接被屏蔽,或者有权限问题,可以私聊作者解决。

  大致题集一览:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述



在这里插入图片描述


  为了让这件事情变得有趣,以及「 照顾初学者 」,目前题目只开放最简单的算法 「 枚举系列 」 (包括:线性枚举、双指针、前缀和、二分枚举、三分枚举),当有 一半成员刷完 「 枚举系列 」 的所有题以后,会开放下个章节,等这套题全部刷完,你还在群里,那么你就会成为「 夜深人静写算法 」专家团 的一员。
  不要小看这个专家团,三年之后,你将会是别人 望尘莫及 的存在。如果要加入,可以联系我,考虑到大家都是学生, 没有「 主要经济来源 」,在你成为神的路上,「 不会索取任何 」。
  🔥联系作者,或者扫作者主页二维码加群,加入刷题行列吧🔥


🔥让天下没有难学的算法🔥

C语言免费动漫教程,和我一起打卡!
🌞《光天化日学C语言》🌞

让你养成九天持续刷题的习惯
🔥《九日集训》🔥

入门级C语言真题汇总
🧡《C语言入门100例》🧡

组团学习,抱团生长
🌌《算法零基础100讲》🌌

几张动图学会一种数据结构
🌳《画解数据结构》🌳

竞赛选手金典图文教程
💜《夜深人静写算法》💜
Leetcode 297:二叉树的序列化与反序列化(超详细的解法!!!) 序列化是将一个数据结构或者对象转换为连续的比特位的操作,进而可以将转换后的数据存储在一个文件或者内存中,同时也可以通过网络传输到另一个计算机环境,采取相反方式重构得到原数据。 请设计一个算法来实现二叉树的序列化与反序列化。这里不限定你的序列 / 反序列化算法执行逻辑,你只需要保证一个二叉树可以被序列化为一个字符串并且将这个字符串反序列化为原始的树结构。 示例: 你可以将以下二叉树: 1 ... 阅读详情

相关推荐

【中等】力扣算法题解析LeetCode40:组合总和 II

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

ylumwd的博客 1024

⭐算法入门⭐《线性枚举》简单10 —— LeetCode 剑指 Offer 17. 打印从1到最大的n位数

《线性枚举》简单10 —— LeetCode 剑指 Offer 17. 打印从1到最大的n位数

英雄哪里出来 5023

GO与KEGG富集分析实战:从差异基因到功能注释

本文详细介绍了GO与KEGG富集分析的完整实战流程,从差异基因列表出发,通过基因ID转换、核心分析到结果可视化,系统阐述了如何将基因数据转化为生物学洞察。文章重点讲解了使用R语言clusterProfiler包进行GO和KEGG富集分析的具体步骤、参数设置及常见问题解决方案,并强调了结果解读与生物学故事构建的方法,帮助研究者深入理解差异基因的集体功能倾向。

weixin_29291863的博客 918

leetcode 6037. 按奇偶性交换后的最大数字 java

https://leetcode-cn.com/problems/largest-number-after-digit-swaps-by-parity/ class Solution { public int largestInteger(int num) { ArrayList<Integer> odds=new ArrayList<>(); ArrayList<Integer> evens=new ArrayList<&g

乾坤未定,你我皆是黑马 732

对计算机专业来说学历真的重要吗?

我本科学校是渣渣二本,研究生学校是985,现在毕业五年,校招笔试、面试,社招面试参加了两年了,就我个人的经历来说下这个问题。 这篇文章很长,但绝对是精华,相信我,读完以后,你会知道学历不好的解决方案,记得帮我点赞哦。 先说结论,无论赞不赞同,它本质就是这样:对于技术类工作而言,学历五年以内非常重要,但有办法弥补。五年以后,不重要。 目录: 张雪峰讲述的事实 我看到的事实 为什么会这样 ...

启舰 55万+

光电系统光轴校准与偏差控制实战指南

光轴作为光电系统的空间基准坐标系,直接影响多光谱传感器的协同工作精度。在包含可见光、红外与激光测距的复合系统中,光轴偏差会导致目标识别误差与打击精度下降。通过机械基准建立、光学通道粗调和多光谱协同校准等工厂级标定流程,结合千米靶标法、星点校准法等野战应急方案,可有效控制光轴偏差。典型应用场景中,温度补偿与振动抑制技术能维持光轴稳定性,如某舰载系统通过500Hz高频视觉伺服实现0.3mrad振动补偿。掌握这些光轴标定与保持策略,对提升光电系统在侦察、测距等场景的实战性能具有关键价值。

weixin_36149538的博客 273

数组/模拟简单 LeetCode6037. 按奇偶性交换后的最大数字

6037. 按奇偶性交换后的最大数字 描述 给你一个正整数 num 。你可以交换 num 中 奇偶性 相同的任意两位数字(即,都是奇数或者偶数)。 返回交换 任意 次之后 num 的 最大 可能值。 class Solution { public int largestInteger(int num) { char[] nums = (""+num).toCharArray(); int[] ans = new int[nums.length]; Li

31楼下小黑的博客 472

Yersinia:layer 2攻击框架!全参数详细教程!Kali Linux教程!

Yersinia是一个专为执行二层网络攻击设计的框架,利用多种网络协议的弱点进行渗透测试和网络分析。它支持针对生成树协议(STP)、思科发现协议(CDP)、动态中继协议(DTP)、动态主机配置协议(DHCP)、热备用路由器协议(HSRP)、802.1q、802.1x、交换机间链路协议(ISL)和VLAN中继协议(VTP)的攻击。这些攻击可能导致网络中的拒绝服务(DoS)或为更复杂的攻击创造条件。Yersinia对渗透测试人员和网络管理员非常有用,但使用时需谨慎,以免造成网络不稳定。

qq_24305079的博客 2281

LeetCode 力扣 40. 组合总和 II

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

wind_liang的博客 1088

5.30华为OD机试真题 新系统 - 链表数字游戏 (Java/Py/C/C++/Js/Go)

5.30华为OD机试真题 新系统 - 链表数字游戏 (Java/Py/C/C++/Js/Go)

算法大师! 1114

华为OD机试真题 新系统2026-04-01 C语言 实现【计算数列位置N的值】

1、输入M、N两个数,则按照以下规则形成一个数列; 2、数列的前M个元素的值为1到M; 3、从M+1个元素开始,计算的逻辑为: 如果其前面的M个元素中,存在值相同的元素,则该位置上的数值等于前面M个数中最大的数值与最小的数值之如果其前面的M个元素中,不存在值相同的元素,则该位置上的数值等于前面M个数中最大的数值与最小的数值之差;

MISAYAONE的博客 588

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

【即插即用模块】注意力篇 | TGRS 2025 | MFA聚特征+HPDown保细节+HFF融层级,三大模块各司其职,性能翻倍!

本文介绍了MTMLNet网络中的三大核心模块:MFA(多阶段特征聚合)、HPDown(混合池化下采样)和HFF(分层特征融合)。MFA通过双尺度深度卷积和注意力机制增强特征提取能力;HPDown结合平均池化和最大池化,有效保留下采样过程中的特征信息;HFF采用三注意力机制实现自适应特征融合。这三个模块协同工作,在红外小目标检测与分割任务中取得了SOTA效果。实验表明,各模块在特征提取、信息保留和融合方面均优于传统方法,可灵活应用于各类视觉任务中。

主要更新底层视觉(去噪、超分等)相关的科研内容,形式为【论文精读】+【论文复现】 283

力扣:40. 组合总和 II

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

icbbm的博客 506

uniapp - 实现安卓App打包上架应用商店详细教程,详解Hbuilder打包编译apk发布上传到应用市场全流程,提供uniApp云打包、离线打包app、原生本地打包,附带APP备案和安卓证书申请

uni-app,安卓,APP,应用商店,打包编译apk,上架到应用市场,如何打包app并发布到主流应用市场,发布为AndroidApp流程,应用备案,如何申请安卓证书,hbuilder发布安卓apk后怎么上传到各家软件商店,创建app证书,uniapp发行原生APP本地打包安卓APK,详细最全的步骤教程,项目打包成apk,云打包,安心打包,安卓app离线打包,一直审核不通过,被拒绝,不符合规范,上架发布失败,申请安卓证书和获取证书信息,uni-app打包发布安卓Android软件到各大应用商店,腾讯应用

🏆 前端领域优质创作者 1万+

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

LeetCode第40题_组合总和II

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

qq_40263592的博客 1139

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

LeetCode40-组合总和 II

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

lyd1995的博客 175

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

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

leetcode40-组合总和II

leetcode40-组合总和III

weixin_45799371的博客 724

#力扣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

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
上一篇: LeetCode 47. 全排列 II
下一篇: LeetCode 面试题 16.15. 珠玑妙算
英雄哪里出来
英雄哪里出来 2021年博客之星Top1 2021年博客之星Top1 领域专家: 系统编程技术领域 领域专家: 系统编程技术领域
博客等级 码龄17年 30万+粉丝 1016原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

英雄哪里出来

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值