LeetCode 39. Combination Sum 题解

【Cubietruck】Qt5.8.0 x64、x86、armhf三个版本的编译安装 一、       Preparation 以下环境配置支持虚拟机和实体机,但是实体机生产效率会相对高一点,实体机编译Qt的速度是虚拟机两倍以上。 若使用虚拟机,推荐使用VirtualBox,开源免费,尽量不要使用Vmware破解版。   Download List   名称 链接 下载项目 OS https://mirro 阅读详情

这题有几个主要的点,

首先,题目要求输出所有的组合数,而不是数据所有组合总的个数,如果是求个数用动态规划更好解决。但是要输出所有的组合数的话使用回溯法更容易处理。

其次,题目要求不能包含有重复的组合,这是解决这个题目的一个难点。

最后,保存解决方案的时候要注意Java里List的浅拷贝和深拷贝,不然浅拷贝最后得到空值。

解法:

其实回溯的方法还是比较简单的,为了后面处理的适合容易去重和剪枝优化,首先需要对数组进行排序。

排序后,从第一个元素开始搜索,可以重复添加元素,一直累加,并保存每个值到List。

如果这个和等于target,就保存这个List,然后继续回溯。

如果和大于了target则直接返回。

这里去重的关键一步是回溯的时候,在选择下一个值时,循环不能从0开始,否则会出现重复的情况。

这时应该跳过之前已经循环过的值,而寻找后面比当前值更大的值。

List<List<Integer>> res = new ArrayList<>();
	public List<List<Integer>> combinationSum (int[] candidates, int target) {
		Arrays.sort(candidates);
		int sum = 0;
		 if(candidates == null || candidates.length == 0)
	            return res;
		List<Integer> list = new ArrayList<>();
		trace(candidates,target,sum,list,0);
		return res;
    }
	
	/**
	 * 回溯,help(candidates, target-candidates[i], res, path, i);使用减法的比加法的用时更少
	 */
	public void trace(int[] candidates, int target , int sum , List<Integer> list,int start){
		if(sum > target){
			return;
		}
		if(sum == target){
			res.add(new ArrayList<>(list));
			return;
		}
		// 去重的关键在于j的值不能从0开始,而应该是start开始。
		for(int j = start; j < candidates.length;j++){
			if(candidates[j] > target)
                break;
			list.add(candidates[j]);
			trace(candidates,target,sum + candidates[j],list,j);
			list.remove(list.size() - 1);
		}
		
	}

比较一下

int[] candidates = {2,3,6,7};

target = 7时去重和没去重的回溯的区别,没去重时:

[2, 2, 2, 2]
[2, 2, 2, 3]
[2, 2, 2, 6]
[2, 2, 2, 7]
[2, 2, 3]
[2, 2, 6]
[2, 2, 7]
[2, 3, 2]     // 最后2比3小
[2, 3, 3]
[2, 3, 6]
[2, 3, 7]
[2, 6]
[2, 7]
[3, 2, 2]    // 中间2比3小
[3, 2, 3]    // 中间2比3小
[3, 2, 6]    // 中间2比3小
[3, 2, 7]    // 中间2比3小
[3, 3, 2]    // 最后2比3小
[3, 3, 3]
[3, 3, 6]
[3, 3, 7]
[3, 6]
[3, 7]
[6, 2]       // 最后2比6小
[6, 3]       // 最后3比6小
[6, 6]
[6, 7]
[7]

去重后:

[2, 2, 2, 2]
[2, 2, 2, 3]
[2, 2, 2, 6]
[2, 2, 2, 7]
[2, 2, 3]
[2, 2, 6]
[2, 2, 7]
[2, 3, 3]
[2, 3, 6]
[2, 3, 7]
[2, 6]
[2, 7]
[3, 3, 3]
[3, 3, 6]
[3, 3, 7]
[3, 6]
[3, 7]
[6, 6]
[6, 7]
[7]

 

2026.1.9:最新VSCode集成claude插件完美解决方案,跳过登录界面,使用国内Kimi K2进行计费 本文介绍了如何安装配置Claude插件并连接Kimi K2 API的详细步骤:1)搜索安装Claude插件;2)进入设置关闭登录提示;3)在settings.json中添加API配置,包括ANTHROPIC_AUTH_TOKEN(需替换为Kimi API Key)和ANTHROPIC_BASE_URL;4)通过Kimi官网获取API Key。完成配置后即可正常使用该插件。文中配有完整的操作截图指引。 阅读详情

相关推荐

深入解析Android14应用安装权限:从声明到授予的完整适配指南

本文深入解析Android14应用安装权限的适配方法,重点介绍了从权限声明到授予的完整流程。与Android13相比,Android14在权限管理机制上进行了重要调整,特别是通过AppOpsManager实现权限的对象化封装。文章详细讲解了权限声明的基础配置、Framework层适配方案、运行时权限授予方法以及常见问题排查指南,帮助开发者高效完成Android14权限适配。

o9p0q1的博客 694

LeetCode之Combination Sum算法过程详解

讨论区的解法基本都是回溯和递归,说到回溯递归基本就一句话“自己调用自己”,而实际运行过程总是让人很晕。现为了方便详细分析整个算法过程,选取candidates数组只包含两个数{2,4};target=6; class Solution { public List<List<Integer>> combinationSum(int[] candidates, int...

kaylee_study的博客 289

Win10下Altera USB-Blaster驱动安装详解:禁用数字签名与排查指南

在嵌入式开发和FPGA调试过程中,驱动安装是工程师绕不开的环节,尤其是当操作系统对驱动签名有严格限制时,硬件往往无法被正常识别。数字签名是系统验证驱动程序来源和完整性的重要机制,Win10出于安全考虑,默认拒绝加载未经签名的驱动,这正是Altera USB-Blaster下载器在设备管理器中显示未知设备或黄色感叹号的根本原因。通过理解设备管理器的排查逻辑,掌握临时禁用驱动强制签名或开启测试模式的方法,配合正确的驱动文件路径选择与手动安装操作,即可解决Quartus无法检测到下载器的问题。这一流程同样适用于许

weixin_29164497的博客 245

leetcode combination-sum题集

39. 组合总和 https://leetcode-cn.com/problems/combination-sum/ 40. 组合总和 II https://leetcode-cn.com/problems/combination-sum-ii/ 216. 组合总和 III https://leetcode-cn.com/problems/combination-sum-i...

silent_crown的博客 392

uniapp map地图实现marker聚合点,并点击marker触发事件

【代码】uniapp map地图实现marker聚合点,并点击marker触发事件。

weixin_44705979的博客 5437

winpcap无法安装提示新版本已经安装解决办法

问题显示如下该问题会导致ensp里的云识别不到网卡可能是因为之前安装了npcap,而且安装时勾选了第四个选项导致无法安装,需要完全卸载npcap解决办法:办法一:在控制面板的程序与卸载里面卸载npcap和winPcap,然后再安装winPcap,如果搜不到往下看办法二:在C:\Windows\SysWOW64目录下搜索wpcap.dll和packet.dll并重命名为wpcap.dll.old和packet.dll.old办法三:如果搜不到这两个文件需要安装win10Pcap才能找到这两个文件下载地址:Wi

qq_73202377的博客 3万+

LeetCode 之组合总和系列(Combination Sum)

个人博客:DoubleFJ の Blog LeetCode 中有多道组合总和(Combination Sum)的题,这些题目都是比较经典的,面试很可能会问到。我这一想,还真是。今天就来简单总结下这一系列题目,总结很重要,还要时而回顾! Combination Sum I 第一道题的描述如下: 给定一个无重复元素的数组 candidates 和一个目标数 target ,找出 candidate...

DoubleFJ の Blog 1421

测绘无人船避坑指南:云卓H12Pro遥控器接海康摄像头,从网络设置到RTSP流延迟优化全流程

本文详细解析了测绘无人船视频子系统的优化方案,重点介绍海康威视摄像头与云卓H12Pro遥控器的深度适配流程。从网络设置到RTSP流延迟优化,提供了一套经过实测的低延迟(<200ms)解决方案,适用于复杂水域环境下的测绘任务。

weixin_30415113的博客 625

二分1. 在排序数组中查找数字出现次数

在排序数组中查找数字 排序数组往往用的是二分 求排序数组中的数字出现的次数 首先利用二分找到第一个数字,然后在它的左侧和右侧可能都存在这个数字,顺序扫描左右直到找到所有的这个数字,但这样是O(n)。 第二种方法是更好的利用二分查找,也就是找到第一个这个数字和最后一个这个数字,即可得到这个数字的出现次数。 找第一个数字的时候,首先找到中间的数,将它和要找的数比较,如果不等于它,说明这个数肯定在两边,则继续往两边找,如果等于这个数,就看它是不是第一个数,如果不是,继续往左边找,直到找到第一个数。 第三种方法是变

weixin_47040809的博客 604

2026年全国青少年信息素养大赛复赛真题(算法应用主题赛C++小学组:带解析)(7月4日试卷一)【文末附答案和解析】

2026年全国青少年信息素养大赛复赛真题(算法应用主题赛C++小学组:带解析)(7月4日试卷一)【文末附答案和解析】

王老师青少年编程 1737

使用mindie:2.0.RC2-800I-A2-py311-openeuler24.03-lts制作一个通用的模型推理性能测试的镜像

本文详细介绍了在NPU环境下进行模型推理性能测试的完整流程。首先配置了测试所需的环境和设备信息,包括Python 3.10.9和3.11.6版本、测试脚本和镜像文件。然后分步骤说明了镜像制作过程:创建特权容器、安装Python 3.10.9、配置VLLM环境,并详细描述了测试容器的启动方法。最后提供了镜像打包和使用指南,包括如何加载镜像、启动容器、运行测试脚本(以DeepSeek-32B模型为例)以及更换测试模型的步骤。整个过程涉及环境变量配置、权限设置和服务启动等关键操作。

m0_50105717的博客 1015

leetcode 39. Combination Sum(组合数之和)

给出一个数组,每个数字都是不同的,返回所有的数字组合,使它们的和为target。 每个数字可以重复使用。 思路: 组合问题,用组合版的dfs,因为每个元素可以重复使用,所以下标从当前数字下标 i 开始 如下 dfs(start index, candidates): for i = i to end stack.push(candidates[i]) dfs(i, candidates) stack.pop() 数字和为target,每经过一个元素,令剩下的元素和为targe.

蓝羽飞鸟的博客 354

使用W5500与外网通信故障解决(MAC地址问题)

在蒲城项目的调试时,AMS500发现一个致命的问题,就是:在局域网跨网段通信时候和中心服务器不能通信,但是在一个HUB下是没有问题的,以前的串口服务器有过类似的问题出现,解决方法说是芯片的问题,结果也不了了之,换了芯片正常。 我们的网络通信芯片选择W5500,其中的MAC地址采用的是CPU的序列号作为Mac地址的问题就出在这,我们在使用的时候MAC地址的第一个必须是偶数,我们忽视了。 现象描...

zxm8513优快云博客 7755

leetcode题解:第39题Combination Sum

https://leetcode-cn.com/problems/combination-sum/submissions/ 文章目录分析解法代码 分析 这道题也是典型的回溯算法代表题,题目要求找到所有的解,每一个解都是由候选数组中的元素组成的,因此我们可以利用回溯算法,一次将一个元素加入到组合中,再判断组合是否是一个解。在回溯过程中还需要剪枝,剪掉不可能找到解的分支和会产生重复解的分支。 解法 最容易想到的方法,把候选数组中的元素一个个加入到组合中,然后计算组合中所有元素之和:如果大于目标数,则这个搜索分支

chenf1999的博客 242

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

Statistics and Machine Learning Toolbox

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

Leetcode题解-39. Combination Sum

Leetcode题解-39. Combination SumGiven a set of candidate numbers (C) (without duplicates) and a target number (T), find all unique combinations in C where the candidate numbers sums to T.The same repeate

hzw2945的博客 333

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

LeetCode题解 39. Combination Sum

仅仅用作自己练习的记录用。题目地址:https://leetcode.com/problems/combination-sum/description/大意就是说给你一串数字,从里面挑选(可重复)数字进行组合,数字之和为一个给定的数class Solution { public: vector&lt;vector&lt;int&gt; &gt;ve; vector&lt;...

wcnmcsdn的博客 202

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

LeetCode 39. Combination Sum 题解(回溯 / DFS)

给定一个由互不相同的正整数构成的数组 candidates,以及一个目标值 target,找出所有可以使数字和为 target 的组合。数组中的数字可以被重复选择任意次,但组合之间不能重复,返回结果的顺序可以任意。

六六哥的博客 370

leetcode个人题解——#39 Combination Sum

思路:先对数据进行排序(看评论给的测试数据好像都是有序数组了,但题目里没有给出这个条件),然后回溯加剪枝即可。 class Solution { public: int size = 0; vector<vector<int>> ans; void search(int pos, vector<int>& candi...

weixin_30527551的博客 95

LeetCode题解39.Combination Sum

39. Combination Sum Given a set of candidate numbers (C) (without duplicates) and a target number (T), find all unique combinations in C where the candidate numbers sums to T. The same repeated number...

weixin_30485799的博客 109

leetcode题解-39. Combination Sum

题目:Given a set of candidate numbers (C) (without duplicates) and a target number (T), find all unique combinations in C where the candidate numbers sums to T.The same repeated number may be chosen from

呜呜哈的博客 1071

leetcode题解(十九):39. Combination Sum

Input: candidates = [2,3,6,7], target = 7, A solution set is: [ [7], [2,2,3] ] public List<List<Integer>> combinationSum(int[] nums, int target) { //list里是list,list里是int List<List&...

微博@山椒鱼只想坐在地上生根发芽 146

LeetCode 39 | 组合总和(Combination Sum)C语言高质量题解

摘要: 该问题要求从无重复元素的整数数组candidates中找出所有和为target的组合,允许重复使用同一数字。通过回溯算法实现:从当前索引开始递归尝试每个数字,若数字不大于剩余目标值则继续递归,否则剪枝。当目标值为0时保存当前组合。C语言实现中,使用path数组记录组合,动态分配内存存储结果。时间复杂度约为O(N^T),其中N为候选数个数,T为目标值。示例展示了回溯过程及剪枝优化。

2302_80441878的博客 184

[LeetCode] 039. Combination Sum (Medium) (C++)

[LeetCode] 039. Combination Sum (Medium) (C++)

水果君の日常 2352

LeetCode39. Combination Sum(思路及python解法)

Share Given asetof candidate numbers (candidates)(without duplicates)and a target number (target), find all unique combinations incandidateswhere the candidate numbers sums totarget. Thesame...

AIpush的博客 405
上一篇: Java new 背着我们干了什么
下一篇: Leetcode-494-Target-Sum
TaiSung
博客等级 码龄15年 49粉丝 132原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值