面试算法82:包含重复元素集合的组合

题目

给定一个可能包含重复数字的整数集合,请找出所有元素之和等于某个给定值的所有组合。输出中不得包含重复的组合。例如,输入整数集合[2,2,2,4,3,3],元素之和等于8的组合有2个,分别是[2,2,4]和[2,3,3]。

分析

避免重复的组合的方法是当在某一步决定跳过某个值为m的数字时,跳过所有值为m的数字。例如,假设求[2,2,2]的组合,如果在处理第1个2时决定跳过它并跳过所有的2,那么得到的是一个空的组合。如果选择第1个2之后决定跳过第2个2并连带跳过后面的2,那么得到的是组合[2]。如果选择前两个2之后决定跳过第3个2,那么得到的是组合[2,2]。如果3个2都被选择,则得到组合[2,2,2]。采用这个办法就可以避免产生重复的组合,如避免了两种产生重复组合[2,2]的情形,一种情形是跳过第1个2选择后面两个2,另一种情形是跳过中间一个2选择前后两个2。
为了方便跳过后面所有值相同的数字,可以将集合中的所有数字排序,把相同的数字放在一起,这样方便比较数字。当决定跳过某个值的数字时,可以按顺序扫描后面的数字,直到找到不同的值为止。

public class Test {public static void main(String[] args) {int[] nums = {2, 2, 2, 4, 3, 3};List<List<Integer>> result = combinationSum2(nums, 8);for (List<Integer> item : result) {System.out.println(item);}}public static List<List<Integer>> combinationSum2(int[] nums, int target) {Arrays.sort(nums);List<List<Integer>> result = new LinkedList<>();LinkedList<Integer> combination = new LinkedList<>();helper(nums, target, 0, combination, result);return result;}private static void helper(int[] nums, int target, int i, LinkedList<Integer> combination,List<List<Integer>> result) {if (target == 0) {result.add(new LinkedList<>(combination));}else if (target > 0 && i < nums.length) {helper(nums, target, getNext(nums, i), combination, result);combination.addLast(nums[i]);helper(nums, target - nums[i], i + 1, combination, result);combination.removeLast();}}private static int getNext(int[] nums, int index) {int next = index;while (next < nums.length && nums[next] == nums[index]) {next++;}return next;}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/593326.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

BUUCTF——Reverse——Java逆向解密

1、题目 2、工具 jd-gui&#xff1a;Java反汇编器。 ​python&#xff1a;编写自动化脚本。 3、方法 下载压缩包&#xff0c;解压得到一个.class文件。 ​题目已经说了是java逆向&#xff0c;所以使用jd-gui打开该文件。 代码如下&#xff1a; import java.io.PrintStream; …

WiFi7:EMLSR 操作之二 – 打开和关闭

原文&#xff1a;non-AP MLD如果想打开EMLSR模式&#xff0c;那么 --non-AP STA必须发送EML Operating Mode Notification帧&#xff0c;EML Control域的EMLSR Mode子域设置为1。 --可选的&#xff0c;non-AP STA将EML Control 域的In-Devic Coexistence Activities子域设置为1…

大模型笔记 【1】 大模型初探

以下是Andrej Karpathy一小时讲解chatgpt的笔记。 Andrej Karpathy做自动驾驶的人应该比较熟悉&#xff0c;他是李飞飞的学生。在openAI做了一年半的科学家之后&#xff0c;去了特斯拉。在Tesla AI day讲解tesla自动驾驶方案的就是他。 这里我的主要收获是两个 大模型是一个有…

王道考研计算机组成原理——数据的表示和运算

数制转换 任意进制》十进制&#xff1a;位权*位数即可 整数部分补0是补在头部&#xff0c;小数部分补0是补在尾部 一般都是先把十进制》二进制&#xff1b;然后二进制再转换成8/16进制这样子 一种更快的方法->拼凑法&#xff1a;小数部分整数部分都可以这样求 一般都是先…

挑战Python100题(9)

100+ Python challenging programming exercises 9 Question 81 Please write a program to randomly print a integer number between 7 and 15 inclusive. Hints: Use random.randrange() to a random integer in a given range. 请编写一个程序,随机打印一个介于7和15之间…

Single-Image Crowd Counting via Multi-Column Convolutional Neural Network

Single-Image Crowd Counting via Multi-Column Convolutional Neural Network 论文背景人群密度方法过去的发展历史早期方法基于轨迹聚类的方法基于特征回归的方法基于图像的方法 Multi-column CNN用于人群计数基于密度图的人群计数通过几何自适应核生成密度图密度图估计的多列…

Rhel8安装Postgres

前提 实际上安装数据库的过程大同小异&#xff0c;只要linux的代差和数据库代差不是大的离谱的话都是同样的操作流程 本次工作环境是RHEL8.8&#xff0c;类推RHEL7&#xff0c;8&#xff0c;9没有问题 使用postgre是13版本&#xff0c;话说中文社区只更新到12版本 安装步骤…

ChatGPT在金融财务领域的10种应用方法

1.生成报告 在金融领域中&#xff0c;最耗时的任务之一是报告生成。通过ChatGPT&#xff0c;您可以在一定程度上自动化这个过程。这款人工智能工具可以获取关于公司财务表现的结构化数据&#xff0c;并生成一份书面摘要&#xff0c;详细说明关键点、趋势和观察结果。这个功能在…

【论文+在线运行】AnyText:能准确写汉字的AI绘图工具

源码&#xff1a;https://github.com/tyxsspa/AnyText 阿里在线运行: https://modelscope.cn/studios/damo/studio_anytext/summary 论文&#xff1a;2311.AnyText: Multilingual Visual Text Generation And Editing 一、AnyTexT是什么&#xff1f; 是一个基于扩散模型的&am…

ATE自动测试设备是什么?如何帮助测试电源反复短路?

什么是电源反复短路测试? 反复短路测试是电源极限测试项目之一&#xff0c;是在各种输入和输出状态下将电源输出短路&#xff0c;反复多次短路测试&#xff0c;检测电源是否可以实现保护或回缩&#xff0c;测试结束后之后&#xff0c;电源是否可以自动恢复正常运行。反复短路测…

python初试终章

之前在单机上实现了一个Django服务器&#xff0c;现在我们可以把这个服务器推上一个云平台。这里我选择使用阿里云。 阿里云准备 在阿里云官网(aliyun.com)页面注册阿里云账号。登录后选择云服务器ECS&#xff0c;并选择“创建实例”&#xff1a; 选择操作系统Ubuntu 14.04 …

Java原生启动Tomcat

文章目录 引入依赖启动Tomcat代码示例将嵌入式 Tomcat 服务器用于已有的 WAR 文件为现有的 Java Web 应用程序嵌入 Tomcat 服务器 相关APITomcat APIContonxt API 启动错误springboot底层Tomcat的实现学习博客 引入依赖 maven: <dependency><groupId>org.apache.…

python 深度学习 记录遇到的报错问题10

本篇继python 深度学习 解决遇到的报错问题9_module d2l.torch has no attribute train_ch3-CSDN博客 一、CUDA error: no kernel image is available for execution on the device CUDA kernel errors might be asynchronously reported at some other API call,so the stackt…

数据结构【图篇】

数据结构【图篇】 文章目录 数据结构【图篇】前言为什么突然想学算法了&#xff1f;为什么选择码蹄集作为刷题软件&#xff1f; 目录一、图(一)、图的存储(二)、图的基本操作(三)、最短路径问题 二、拓扑排序三、结语 前言 为什么突然想学算法了&#xff1f; > 用较为“官方…

【PHP】判断字符串是否是json类型,并判断是否是有效数组

要在 PHP 中判断给定的字符串是否是 JSON&#xff0c;可以使用 json_decode() 函数和检查返回值的类型。以下是一个示例&#xff0c;展示了如何判断给定的字符串是否是 JSON&#xff0c;以及如何判断它是数组还是字符串&#xff1a; <?phpfunction isJson($string) {json_…

金融追梦者,向着春天出发——社科院与美国杜兰大学金融管理硕士

随着时代的进步和社会的变迁&#xff0c;教育已经不再是单纯的学生时代的事情&#xff0c;而是贯穿人的一生。特别是在金融行业&#xff0c;由于其变幻莫测的特性&#xff0c;在职继续攻读硕士学位的人越来越多。他们希望通过进一步的学习和研究&#xff0c;提升自己的专业素养…

transformers Trainer自定义optimizer和scheduler

1.需求 我自定义了一个evaluate方法&#xff0c;想在每一轮训练过后都执行一次。如果只是在TrainingArguments里设置warmup_steps100&#xff0c;那么每轮都会重置学习率&#xff0c;也就是每一轮开始的时候都会按照warmup刚开始的学习率进行训练&#xff0c;这就很头疼。 2.…

【双指针算法】-- 左右指针

左右指针 前言一、双指针算法二、左右指针1.用于在已排序数组中找到两个数使其和为特定值2.在字符串中判断是否为回文 总结 前言 今天在刷Leetcode的时候觉得自己双指针掌握的还是不错的记录一下,写个学习笔记,也方便以后翻阅,如果也帮助到你了,那真是太好啦! 本篇介绍的是左右…

js创建服务器,以及对接口的理解和创建

// 创建服务 const app http.createServer((req, res)>{ // 设置给前端返回信息的字符编码 res.setHeader(content-type, text/html; charsetutf-8) let address req.url.split(?)[0] //首先创建一个数组&#xff0c;后面把它的数据放在JSON文件 let…

医院配电能效监管方案

摘要:本文以医院能源监管系统为研究对象,采用智能化技术组建数据库、构建智能化的能耗信息管理系统,实现对医院的能源利用状况进行实时、准确的动态监管。具体而言,该系统建设的主要功能是对医院的能源消耗进行采集、上报、汇总与分析,并生成动态的数据和报表曲线,以及利用分析…