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

news2024/11/16 21:50:58

本题是扩展题,真实考过,看这个题之前先看一下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;

    }
}

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

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

相关文章

Docker:解决开发运维问题的开源容器化平台

云计算de小白 Docker是一个开源的容器化平台&#xff0c;可以将应用程序及其依赖的环境打包成轻量级、可移植的容器。 Docker为什么这么受欢迎呢?原因很简单&#xff1a;Docker可以解决不同环境一致运行的问题&#xff0c;而且占用资源少&#xff0c;速度快。 所以好的东西…

链式队列操作

文章目录 &#x1f34a;自我介绍&#x1f34a;概述&#x1f34a;链式队列代码linkstack.clinkstack.hmain.c 你的点赞评论就是对博主最大的鼓励 当然喜欢的小伙伴可以&#xff1a;点赞关注评论收藏&#xff08;一键四连&#xff09;哦~ &#x1f34a;自我介绍 Hello,大家好&…

OmniPeek 空口抓包软件安装指导

OmniPeek 空口抓包软件安装指导 1 双击omnp75安装包---Unzip解压缩 生成install包 2 进入install文件夹点击setup开始进入安装界面 3 点击install Omnipeek 4 点击next,勾选手动安装

云原生虚拟化kubevirt安装

kubevirt 介绍 Kubevirt 是 Redhat 开源的一套以容器方式运行虚拟机的项目&#xff0c;通过 kubernetes 云原生方式来管理虚拟机生命周期。它通过使用自定义资源&#xff08;CRD&#xff09;和其它 Kubernetes 功能来无缝扩展现有的集群&#xff0c;以提供一组可用于管理虚拟机…

9.23作业

仿照string类&#xff0c;自己手动实现 My_string 代码如下 MyString.h #ifndef MYSTRING_H #define MYSTRING_H #include <iostream> #include <cstring>using namespace std;class My_string { private:char *ptr; //指向字符数组的指针int size; …

socket.io-client实现实前后端时通信功能

这里我使用的后端 基于node.js的koa框架 前端使用的是vite {"name": "hou","version": "1.0.0","description": "","main": "app.js","scripts": {"test": "echo …

Pointnet++改进59:全网首发MogaBlock(2024最新模块)|用于在纯基于卷积神经网络的模型中进行判别视觉表示学习,具有良好的复杂性和性能权衡

简介:1.该教程提供大量的首发改进的方式,降低上手难度,多种结构改进,助力寻找创新点!2.本篇文章对Pointnet++特征提取模块进行改进,加入MogaBlock,提升性能。3.专栏持续更新,紧随最新的研究内容。 目录 1.理论介绍 2.修改步骤 2.1 步骤一 2.2 步骤二 2.3 步骤三 1.…

GreenPlum与PostgreSQL数据库

*** Greenplum*** 是一款开源数据仓库。基于开源的PostgreSQL改造&#xff0c;主要用来处理大规模数据分析任务&#xff0c;相比Hadoop&#xff0c;Greenplum更适合做大数据的存储、计算和分析引擎 它本质上是多个PostgreSQL面向磁盘的数据库实例一起工作形成的一个紧密结合的数…

微软宣布弃用面向企业的WSUS更新服务 仍然保留该服务但不再添加任何新功能

Windows Server Update Services 是微软面向企业推出的一项更新服务&#xff0c;该服务已经存在很多年&#xff0c;允许 IT 管理员控制内网设备的更新节奏。今年早些时候微软宣布将在 2025 年 4 月 18 日开始弃用 WSUS 驱动程序同步功能&#xff0c;因为大约只有 1/3 的 IT 管理…

生成PPT时支持上传本地的PPT模板了!

制作 PPT 时想要使用特定的 PPT 模板&#xff1f; 现在&#xff0c;歌者 PPT 的「自定义模板功能」已全面升级&#xff01;你可以轻松上传自己的本地 PPT 模板&#xff0c;无论是公司统一风格的模板&#xff0c;还是带有个人设计风格的模板&#xff0c;都能无缝导入歌者 PPT。…

单链表:学生信息管理系统

一、头文件 #ifndef __LINK_H__ #define __LINK_H__ #include <myhead.h> #define MAX 30 // 建立学生结构体 typedef struct student {int id; //学号char name[20]; //姓名float score; //分数 }stu;typedef struct node {union{int len;stu data;};struct node * nex…

玄机--哥斯拉流量

1、黑客的ip 过滤http&#xff0c;观察哪个ip一直在发送请求包 2、什么漏洞 因为是哥斯拉&#xff0c;那么黑客在连接成功之前一定上传这个木马文件到服务端 hello.jsp是木马文件&#xff0c;过滤http contains “hello.jsp” 最早是PUT这个方法 3、文件名 hello.jsp 保存…

让AI激发创作力:OpenAI分享5位专业作家利用ChatGPT写作的案例技巧

大家好&#xff0c;我是木易&#xff0c;一个持续关注AI领域的互联网技术产品经理&#xff0c;国内Top2本科&#xff0c;美国Top10 CS研究生&#xff0c;MBA。我坚信AI是普通人变强的“外挂”&#xff0c;专注于分享AI全维度知识&#xff0c;包括但不限于AI科普&#xff0c;AI工…

GPU硬件如何实现光栅化?

版权声明 本文为“优梦创客”原创文章&#xff0c;您可以自由转载&#xff0c;但必须加入完整的版权声明文章内容不得删减、修改、演绎本文视频版本&#xff1a;见文末 引言 大家好&#xff0c;我是老雷&#xff0c;今天我想从GPU硬件原理出发&#xff0c;给大家分享在图形渲…

JS防抖和节流函数

节流和防抖函数的定义 防抖&#xff1a;只有在最后一次事件发生后的一定时间间隔内没有新的事件触发时&#xff0c;才执行相应的处理函数。节流&#xff1a;在规定的时间间隔内最多只能执行一次相应的处理函数。 效果图 示例图 示例图运行结果如下&#xff1a; 代码 &l…

远程升级,你成功了吗?

最近又遇到了远程升级失败的情况&#xff0c;而且是不明原因的多次接连失败。。。 事情是这样的&#xff1a;最近有客户反馈在乡村里频繁出现掉线的情况。通过换货、换SIM卡对比排查测试&#xff0c;发现只有去年5月22号采购的那批模块在客户环境附近会出现掉线的情况&#xf…

【深度学习】03-神经网络3-1梯度下降网络优化方法

每一条线是一个权重&#xff0c;每个神经元由一个加权和还有一个 激活函数组成。每一层可以理解是一个函数&#xff0c;最终形成一个复合函数&#xff0c;因此求梯度的时候&#xff0c;是一层一层的求解&#xff0c;所以叫做反向传播。 只会考虑当前数据之前的数据&#xff0c;…

潮玩宇宙大逃杀宝石游戏搭建开发

潮玩宇宙大逃杀的开发主要涉及以下方面&#xff1a; 1. 游戏概念和设计&#xff1a; 核心概念定义&#xff1a;确定以潮玩为主题的宇宙背景、游戏的基本规则和目标。例如&#xff0c;玩家在宇宙场景中参与大逃杀竞技&#xff0c;目标是成为最后存活的玩家。 玩法模式设计&a…

k8s上安装prometheus

一、下载对应的kube-prometheus源码 github地址&#xff1a;GitHub - prometheus-operator/kube-prometheus: Use Prometheus to monitor Kubernetes and applications running on Kubernetes 1&#xff09;进入目录 [rootk8s-master ~]# cd kube-prometheus [rootk8s-master…

商城小程序源码搭建部署,商城购物小程序开发流程(php框架)

关于商城小程序 商城小程序作为一种基于移动互联网的在线购物平台&#xff0c;商家可以上架所销售的产品&#xff0c;定价&#xff0c;以及营运营的在线售货平台。买家无需下载应用&#xff0c;在小程序搜索打开即可浏览下单商品。 技术栈 前端: vue uniapp 后端&#xff1a…