当前位置: 首页 > news >正文

Leetcode面试经典150题-39.组合总数进阶:40.组合总和II

本题是扩展题,真实考过,看这个题之前先看一下39题

Leetcode面试经典150题-39.组合总数-CSDN博客

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

示例 2:

输入: candidates = [2,5,2,1,2], target = 5,
输出:
[
[1,2,2],
[5]
]

提示:

  • 1 <= candidates.length <= 100
  • 1 <= candidates[i] <= 50
  • 1 <= target <= 30

其他的就不多说了,上代码,看不懂的请留言或者私信,收到第一时间解答

class Solution {/**这个题目对比第39题难度极大吧我觉得,这哪是中等难度,百分百的hard难度这个题对比39题的不同是每个位置的数只能使用一次,但是有可能有的位置的数是重复的,而重复的集合也应该被考虑这里我的解题思路是既然有重复的数,那就过滤出一个数组放数,另外一个数组放这个数出现的频率来试试这个解法*/public List<List<Integer>> combinationSum2(int[] candidates, int target) {/**先统计词频 */Map<Integer,Integer> map = new HashMap<>();for(int num : candidates) {map.put(num, map.getOrDefault(num, 0) + 1);}/**统计完词频之后把原来的数组分为两个数组,这里我想先排序,所以这里先统计出数字数组,稍后再统计词频数组 */int[] nums = new int[map.keySet().size()];int curIndex = 0;for(int num : map.keySet()) {nums[curIndex ++] = num;}/**排个序用于剪枝*/Arrays.sort(nums);/**统计词频数组 */int[] counts = new int[nums.length];for(int i = 0; i < nums.length; i++) {counts[i] = map.get(nums[i]);}return process(nums, counts, 0, target);}public List<List<Integer>> process(int[] nums, int[] counts, int curIndex, int targetLeft) {List<List<Integer>> ans = new ArrayList<>();if(targetLeft == 0) {ans.add(new ArrayList<>());return ans;}/**如果targetLeft不为0,但是我们没有数了,失败,返回空集合 */if(curIndex == nums.length) {return ans;}/**我们是按照从小到大排序的数组,如果targetLeft已经比当前数小了也没必要继续尝试了 */if(targetLeft < nums[curIndex]) {return ans;}/**其他情况正常尝试,当前数可以尝试Math.min(count[curIndex], targetLeft/nums[curIndex])次*/for(int i = 0; i <= Math.min(counts[curIndex], targetLeft/nums[curIndex]); i++) {List<List<Integer>> next = process(nums, counts, curIndex + 1, targetLeft - i * nums[curIndex]);for(List<Integer> list : next) {/**当前数加了多少个,就加入多少个到next中的集合中,因为确实是使用了这么多个 */for(int num = 0; num < i; num ++) {list.add(nums[curIndex]);}/**加入到当前数的集合 */ans.add(list);}}return ans;}
}

相关文章:

  • 【OpenCV】 Python 图像处理 入门
  • vscode 顶部 Command Center,minimap
  • php中根据指定日期获取所在天,周,月,年的开始日期与结束日期
  • C# ReoGrid使用记录
  • 阿里云服务器操作系统 Alibaba Cloud Linux 全新升级,核心场景性能提升超 20%
  • 学习react小记
  • Easy Excel从入门到精通!!!
  • IP与网关的关系
  • 免杀笔记 ---> 无痕Hook?硬件断点 Syscall!
  • C语言中的栈
  • 华为OD机试 - 对称美学(Python/JS/C/C++ 2024 E卷 100分)
  • 一文把数据架构讲明白
  • HTML5实现好看的唐朝服饰网站模板源码2
  • vue创建
  • 软件设计——随手笔记
  • [译]Python中的类属性与实例属性的区别
  • create-react-app做的留言板
  • gulp 教程
  • Java 23种设计模式 之单例模式 7种实现方式
  • JavaScript设计模式与开发实践系列之策略模式
  • Meteor的表单提交:Form
  • MyEclipse 8.0 GA 搭建 Struts2 + Spring2 + Hibernate3 (测试)
  • PHP CLI应用的调试原理
  • Spark RDD学习: aggregate函数
  • Zepto.js源码学习之二
  • 使用阿里云发布分布式网站,开发时候应该注意什么?
  • 推荐一款sublime text 3 支持JSX和es201x 代码格式化的插件
  • 我是如何设计 Upload 上传组件的
  • 教程:使用iPhone相机和openCV来完成3D重建(第一部分) ...
  • 数据库巡检项
  • ​html.parser --- 简单的 HTML 和 XHTML 解析器​
  • ​中南建设2022年半年报“韧”字当头,经营性现金流持续为正​
  • # centos7下FFmpeg环境部署记录
  • # 安徽锐锋科技IDMS系统简介
  • #FPGA(基础知识)
  • $(selector).each()和$.each()的区别
  • (16)UiBot:智能化软件机器人(以头歌抓取课程数据为例)
  • (2022 CVPR) Unbiased Teacher v2
  • (2024,Vision-LSTM,ViL,xLSTM,ViT,ViM,双向扫描)xLSTM 作为通用视觉骨干
  • (22)C#传智:复习,多态虚方法抽象类接口,静态类,String与StringBuilder,集合泛型List与Dictionary,文件类,结构与类的区别
  • (MTK)java文件添加简单接口并配置相应的SELinux avc 权限笔记2
  • (二)什么是Vite——Vite 和 Webpack 区别(冷启动)
  • (转)【Hibernate总结系列】使用举例
  • (转)关于多人操作数据的处理策略
  • .desktop 桌面快捷_Linux桌面环境那么多,这几款优秀的任你选
  • .NET Reactor简单使用教程
  • .NET 分布式技术比较
  • .NET 解决重复提交问题
  • .NET的数据绑定
  • [ vulhub漏洞复现篇 ] Hadoop-yarn-RPC 未授权访问漏洞复现
  • [AIGC] HashMap的扩容与缩容:动态调整容量以提高性能
  • [android] 练习PopupWindow实现对话框
  • [AR Foundation] 人脸检测的流程
  • [ASP.NET MVC]Ajax与CustomErrors的尴尬
  • [BUG] Authentication Error