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

news2025/1/16 3:38:58

在这里插入图片描述
使用深度搜索的方法:
由于题目说候选数组中的每个数字在每个组合只能出现一次,所以,为了避免重复,在开始之前对候选数组进行升序排序,这样优先选择小的数,如果当前的数都小于目标值,则后面的数就不用递归了。
具体步骤:
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.coloradmin.cn/o/955069.html

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

相关文章

CSAPP的Lab学习——BombLab

文章目录 前言一、一号炸弹&#xff08;小试牛刀&#xff09;二、二号炸弹&#xff08;六重循环&#xff09;三、三号炸弹&#xff08;不同输入&#xff0c;不同答案&#xff09;四、四号炸弹&#xff08;判断语句的实现&#xff09;五、五号炸弹&#xff08;跳转&#xff0c;循…

VoxWeekly|The Sandbox 生态周报|20230828

欢迎来到由 The Sandbox 发布的《VoxWeekly》。我们会在每周发布&#xff0c;对上一周 The Sandbox 生态系统所发生的事情进行总结。 如果你喜欢我们内容&#xff0c;欢迎与朋友和家人分享。请订阅我们的 Medium 、关注我们的 Twitter&#xff0c;并加入 Discord 社区&#xf…

PHP多语言代入电商平台api接口采集拼多多根据ID获取商品详情原数据示例

拼多多商品详情原数据API接口的作用是获取拼多多电商平台上某一商品的详细信息&#xff0c;包括商品的标题、价格、库存、图片、描述、包邮信息、销量、评价、优惠券等数据。通过该API接口可以获取到商品的原始数据&#xff0c;用于分析、筛选和展示商品信息。 pinduoduo.item…

typeerror: web3 is not a constructor

typeerror: web3 is not a constructor

PXE批量装机

目录 目录 一、概念 二、PXE的组件 三、操作步骤 一、配置基础环境 二、安装软件 三、文件配置 一、DHCP配置 二、配置TFTP 三、pxelinx.0 四、新机器验证 一、第一次验证 二、第二次验证 五、配置pxe无人值守安装 六、无人值守验证 一、概念 PXE是批量装机系统…

上海亚商投顾:沪指震荡微跌 北向资金单月净卖出900亿

上海亚商投顾前言&#xff1a;无惧大盘涨跌&#xff0c;解密龙虎榜资金&#xff0c;跟踪一线游资和机构资金动向&#xff0c;识别短期热点和强势个股。 一.市场情绪 三大指数今日震荡调整&#xff0c;科创50走势较强&#xff0c;盘中一度涨超1%&#xff0c;随后上演冲高回落走…

找不到msvcp140.dll解决方法?msvcp140.dll修复教程

今天&#xff0c;我想和大家分享一个关于电脑问题的解决方法——找不到msvcp140.dll。这个问题在很多使用Windows系统的电脑上都可能出现&#xff0c;尤其是在使用某些软件时&#xff0c;可能会提示缺少msvcp140.dll文件。那么&#xff0c;我们该如何解决这个问题呢&#xff1f…

qt day

#include "widget.h" #include "ui_widget.h" void Widget::my_slot() {} Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this);this->setWindowIcon(QIcon(":/wodepeizhenshi.png"));//設置窗口的…

光流法相关论文-LK光流法,HS光流法,Farneback光流法,FlowNet: 端到端的深度光流估计, RAFT: 结构化的光流估计

目录 光流法 1. Lucas-Kanade光流法&#xff08;稀疏光流法&#xff09;&#xff1a; 2. Horn-Schunck光流法&#xff08;稠密光流法&#xff09;&#xff1a; 3. Farneback光流法&#xff1a; 4 FlowNet: 端到端的深度光流估计&#xff1a; 5. RAFT: 结构化的光流…

CSP的理解与绕过

文章目录 前言CSP简介CSP如何工作CSP指令CSP指令值 例题[AFCTF 2021]BABY_CSP 前言 刚学习完xss&#xff0c;把xsss-labs靶场都通了打算试试水&#xff0c;遇到此题[AFCTF 2021]BABY_CSP&#xff0c;借此机会学习下CSP CSP简介 Content Security Policy (CSP)内容安全策略&am…

c++版opencv求二值图的质心

代码 #include <iostream> #include <opencv2/core.hpp> #include <opencv2/highgui.hpp> #include <opencv2/imgproc.hpp>int main(int argc, char* argv[]) {cv::Mat input_image cv::imread("Untitled.png", cv::IMREAD_GRAYSCALE);cv:…

springboot自定义表格(动态合并单元格)

一、需求展示&#xff08;一个订单多个商品&#xff0c;商品数量不限订单行合并&#xff09; 二、技术选型&#xff08;jxls自定义模板&#xff09; <!-- 版本具体看官网Release&#xff0c;这里我们使用 2.13.0 --><dependency><groupId>org.jxls</group…

分布式集群框架——zookeeper必考面试题②

15、数据同步 整个集群完成 Leader 选举之后&#xff0c;Learner&#xff08;Follower 和 Observer 的统称&#xff09;回向Leader 服务器进行注册。当 Learner 服务器想 Leader 服务器完成注册后&#xff0c;进入数据同步环节。数据同步流程&#xff1a;&#xff08;均以消息…

工作流程flowable

目录 Flowable工作流分类&#xff1a;一、会签流程二、或签流程分支流程四、并行流程 第二步&#xff1a;源码及表结构对应关系部署一次流程 第三步 流程监听器与任务监听器 Flowable 工作流分类&#xff1a; 参考: link 官方中文文档&#xff1a;网关 一、会签流程 适用场…

【C语言】循环语句详解

✨个人主页&#xff1a; Anmia.&#x1f389;所属专栏&#xff1a; C Language &#x1f383;操作环境&#xff1a; Visual Studio 2019 版本 目录 1.什么是循环结构&#xff1f; 2.while循环 while流程图 while语句中的break和continue break continue 3.for循环 for流…

Ubuntu 20.04.5 怎么安装微信

这是我的ubutun版本号 在这个系统装桌面版微信很多功能不健全。搜索了很多方法&#xff0c;这个算是不错的一个法子。 1.添加仓库 首次使用时&#xff0c;你需要运行如下一条命令将移植仓库添加到系统中。 wget -O- https://deepin-wine.i-m.dev/setup.sh | sh 2.应用安装 …

无代码:软件开发从代码语言到业务语言的拐点

在互联网巨头和中小企业纷纷追求移动互联和“上云”的今天&#xff0c;业务在线已成为众多企业数字化转型的必经之路。然而&#xff0c;传统的软件重装开发模式已经无法满足企业快速变化的需求&#xff0c;同时IT专业人才的成本也在不断攀升&#xff0c;使得企业的IT交付能力面…

ACL 访问控制 过滤数据 维护网络安全(第七课)

一 ACL 简介 ACL是Access Control List&#xff08;访问控制列表&#xff09;的缩写&#xff0c;是一种用于控制文件、目录、网络设备等资源访问权限的方法。ACL可以对每个用户或用户组设置不同的访问权&#xff0c;即在访问控制清单中为每个用户或用户组指定允许或禁止访问该…

十年网络安全工程师整理:渗透测试工具使用方法介绍

渗透测试&#xff0c;是为了证明网络防御按照预期计划正常运行而提供的一种机制。 渗透人员在不同的位置&#xff08;比如从内网、从外网等位置&#xff09;利用各种手段对某个特定网络进行测试&#xff0c;以期发现和挖掘系统中存在的漏洞&#xff0c;然后输出渗透测试报告&a…

RT-Thread 内核对象模型

静态对象和动态对象 RTT内核采用面向对象的设计思想进行设计&#xff0c;系统级的基础设施都是一种内核对象&#xff0c;例如线程&#xff0c;信号量&#xff0c;互斥量&#xff0c;定时器等。 内核对象分为两类&#xff1a;静态内核对象和动态内核对象&#xff0c;静态内核对…