leetcode40-Combination Sum II

题目

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

]

分析

这道题目要求每个数字只能用一次,根第39道题目类似的解法,只不过在递归的时候需要注意开始坐标应该需要加1了,题目还要求不能包含重复的解,所以可以先给数组排序,然后递归的时候当前元素和上一个元素如果一样的话当前元素就可以忽略不用递归了,因为一样的元素组合出来的解肯定是一样的

java 复制代码
import java.util.List;
import java.util.ArrayList;
import java.util.Arrays;

public class combinationSumII {
	private static List<List<Integer>> res = new ArrayList();
	private static List<Integer> cur = new ArrayList();

	public static void main(String[] args) {
		int[] arr = {10,1,2,7,6,1,5};
		Arrays.sort(arr);
		getRes(arr,8,0);
		for(List<Integer> lis:res) {
			for(Integer data:lis) {
				System.out.print(data + " ");
			}
			System.out.println();
		}
	}
	public static void getRes(int[] arr,int target,int start) {
		if(target < 0) {
			return;
		}
		if(target == 0) {
			res.add(new ArrayList(cur));
			return;
		}
		int len = arr.length;
		for(int i = start;i<len;i++) {
			if(i > start && arr[i-1] == arr[i]) {
				continue;
			}
			cur.add(arr[i]);
			getRes(arr,target-arr[i],i+1);
			cur.remove(cur.size()-1);
		}
	}
}
相关推荐
ambition202421 小时前
操作系统同步:读者-写者问题与读写公平法详解(附每个 PV 操作含义)
linux·开发语言·数据结构·unix
chuan.bai4 小时前
Java RAG 实战(第 11 篇):RAG 知识工作台网页
java·开发语言·人工智能
0x536 小时前
网站通信(一)
java
Terra.K7 小时前
Java异常学习[特殊字符]
java·开发语言·学习
mCell7 小时前
Lua 编程入门:从基础语法到元表
javascript·算法·lua
葡萄城技术团队8 小时前
InfluxDB 2\.x 深度解析:核心架构、Flux 函数与制造业落地指南(三)
java·开发语言·架构
Super 含8 小时前
Android 启动优化(五):线程、GC 与 IO 为什么会拖慢启动?
java·服务器·数据库
counting money8 小时前
Java IO流详解:从InputStream到文件操作实战
java·开发语言·python
wuyk5559 小时前
98.C语言易混难点:字符数组与字符串指针的底层差异
c语言·开发语言·c++·stm32·嵌入式硬件·算法
用户47949283569159 小时前
字节Agent开发技术分享—旧会话越聊越笨,新会话又得重讲?我给 Matt Pocock Skill 炼了套《影分身之术》:本体想清楚,分身写代码,完事回来汇报
面试·agent