Krahets 笔面试精选 88 题——40. 组合总和 II

在这里插入图片描述
使用深度搜索的方法:
由于题目说候选数组中的每个数字在每个组合只能出现一次,所以,为了避免重复,在开始之前对候选数组进行升序排序,这样优先选择小的数,如果当前的数都小于目标值,则后面的数就不用递归了。
具体步骤:
1、定义一个列表freq,每一个元素都是一个数组,其中第一个元素代表候选数字,第二个元素代表数字在候选数组中出现的次数。
2、定义深度优先搜索方法,pos代表当前处理位置,rest代表剩余目标数。
当目标数为0,则说明已经找到了满足条件的组合,就把暂存元素的列表sequence加入ans中,如果pos超过了freq范围,或者rest小于当前元素,则返回,说明不符合,如以上两种都不满足,就进入一个搜索循环,这里要计算most变量,代表最多可以计算几次当前数值,rest / freq.get(pos)[0]:这部分计算表示在当前剩余的目标值 rest 中,最多可以添加多少个当前数字 ,freq.get(pos)[1]:这部分计算表示当前数字在候选数组中的出现次数,将这两个数字较小的返回,这样才能添加不会超过目标值的数量。

class Solution {List<int[]> freq = new ArrayList<int[]>();//第一个元素表示候选数字,第二个元素表示该数字在候选数组中的出现次数。List<List<Integer>> ans = new ArrayList<List<Integer>>();List<Integer> sequence = new ArrayList<Integer>();public List<List<Integer>> combinationSum2(int[] candidates, int target){Arrays.sort(candidates);for(int num:candidates){int size = freq.size();if(freq.isEmpty()||num!=freq.get(size-1)[0]){freq.add(new int[]{num,1});}else{++freq.get(size-1)[1];}}dfs(0,target);return ans;}public void dfs(int pos,int rest){//当目标数为0,说明全部找到了if(rest==0){ans.add(new ArrayList<Integer>(sequence));return;}//如果pos超出当前freq范围,或者rest小于当前数值,则返回,不再继续if(pos==freq.size()||rest < freq.get(pos)[0]){return;}dfs(pos+1,rest);int most=Math.min(rest/freq.get(pos)[0],freq.get(pos)[1]);for(int i=1;i<=most;++i){sequence.add(freq.get(pos)[0]);dfs(pos+1,rest-i*freq.get(pos)[0]);}for(int i=1;i<=most;++i){sequence.remove(sequence.size()-1);        }}
}

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

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

相关文章

Unity 之ToolTip的用法

文章目录 在Unity中&#xff0c;ToolTip是一个在编辑器中使用的UI元素&#xff0c;它提供了鼠标悬停在某个对象或控件上时显示的文本信息。ToolTip通常用于向开发人员提供有关对象、字段、控件或菜单项的附加信息&#xff0c;从而帮助他们更好地理解和使用这些元素。 ToolTip通…

常见变频器品牌-修改参数时的密码汇总

常见变频器品牌-修改参数时的密码汇总 1. 艾默生TD3000系列 密码:8888 2. 艾默生TD3300系列 密码:2002 3. 施耐德变频器 在SUP菜单下,找到COD选项进入,输入6969即可, 4. 台达变频器-B系列 密码:57522 5. 台达变频器-H系列 密码:33582 6. 台达S1系列 密码:57522

FIR滤波器算法

FIR&#xff08;Finite Impulse Response&#xff09;滤波器是一种基于有限长输入信号的数字滤波器&#xff0c;常用于去除数字信号中的噪声和干扰。其特点是具有线性相位响应&#xff0c;可以实现任意的频率响应和通带、阻带等设计参数。 FIR滤波器的数学模型描述如下&#x…

Ubuntu20.04安装ROS

Ubuntu20.04安装ROS Excerpt ubuntu安装方式有两种&#xff0c;一种是安装ubuntu系统&#xff0c;另一种是在windows下安装虚拟机&#xff0c;在虚拟机里安装ubuntu。下面为双系统安装ubuntu&#xff08;用虚拟机装ubuntu会很卡&#xff0c;bug很多&#xff0c;除非电脑配置极好…

meethigher-Apache Poi 实现Excel多级联动下拉框

由于最近做的功能&#xff0c;需要将接口返回的数据列表&#xff0c;输出到excel中&#xff0c;以供后续导入&#xff0c;且网上现有的封装&#xff0c;使用起来都较为麻烦&#xff0c;故参考已有做法封装了工具类。 使用apache poi实现excel联动下拉框思路 创建隐藏单元格&a…

趣味微项目:玩转Python编程,轻松学习快乐成长!

&#x1f482; 个人网站:【工具大全】【游戏大全】【神级源码资源网】&#x1f91f; 前端学习课程&#xff1a;&#x1f449;【28个案例趣学前端】【400个JS面试题】&#x1f485; 寻找学习交流、摸鱼划水的小伙伴&#xff0c;请点击【摸鱼学习交流群】 在学习Python编程的旅程…

elementplus实现左侧菜单栏收缩与展开

1.页面结构 Home.vue下包含aside.vue和menu.vue 2.TAside.vue el-menu左侧菜单栏显示 注意&#xff1a; 要使用收缩与展开&#xff0c;el-aside必须设置width"collapse"&#xff0c;否则收缩展开会出现收缩后&#xff0c;el-aside宽度不变窄需要使用动态改变展开收…

探索隧道ip如何助力爬虫应用

在数据驱动的世界中&#xff0c;网络爬虫已成为获取大量信息的重要工具。然而&#xff0c;爬虫在抓取数据时可能会遇到一些挑战&#xff0c;如IP封禁、访问限制等。隧道ip&#xff08;TunnelingProxy&#xff09;作为一种强大的解决方案&#xff0c;可以帮助爬虫应用更高效地获…

数据资产的一二三

数字经济时代的发展极大地改变了社会经济发展格局&#xff0c;随着云计算、物联网和AI等技术不断革新&#xff0c;基于数字平台的新产业和新的商业模式陆续涌现在大众面前&#xff0c;影响着人类社会生产和生活的模式。在这个时代的影响下&#xff0c;数据的重要性不言而喻&…

Questa Sim使用教程仿真-示例

Questa Sim0基础仿真教程 文章目录 一、 打开软件二、运行编译后的文件 一、 打开软件 1、新建工程 File -> New -> project 2、填写工程名称和工程位置然后点"ok" 3、编写或者添加文件&#xff0c;这里直接添加一个编写好的反相器的文件。 可关注公众号&a…

1775_树莓派3B键盘映射错误解决

全部学习汇总&#xff1a; GitHub - GreyZhang/little_bits_of_raspberry_pi: my hacking trip about raspberry pi. 入手树莓派3B之后用了没有多长时间&#xff0c;最初的这段时间感觉想让它代替我的PC机是不肯能的。性能先不说&#xff0c;我完全没有找到当初在我的笔记本上使…

Unity UI与粒子 层级问题Camera depth Sorting Layer Order in Layer RenderQueue

Unity游戏开发中&#xff0c;模型、界面、特效等&#xff0c;需要规划好layer的概念&#xff0c;涉及到摄像机&#xff08;Camera&#xff09;、画布&#xff08;Canvas&#xff09;、Shader等相关内容。 在 Unity 中&#xff0c;渲染顺序是由多个因素共同决定的&#xff0c;大…