LeetCode-40.组合总和II

news2024/10/6 14:27:36

目录

    • 题目思路
    • 回溯法

题目来源
40.组合总和II

题目思路

这道题目和39.组合总和如下区别:

  • 本题candidates 中的每个数字在每个组合中只能使用一次。
  • 本题数组candidates的元素是有重复的,而39.组合总和是无重复元素的数组candidates

为了理解去重我们来举一个例子,candidates = [1, 1, 2], target = 3,(方便起见candidates已经排序了)
在这里插入图片描述
可以看出,每个节点相对于 39.组合总和我多加了used数组

回溯法

  • 1.递归函数参数

与39.组合总和套路相同,此题还需要加一个bool型数组used,用来记录同一树枝上的元素是否使用过。
这个集合去重的重任就是used来完成的。
代码如下:

    ArrayList<List<Integer>> result = new ArrayList<>();  // 存放组合集合
    ArrayList<Integer> path = new ArrayList<>();   // 符合条件的组合
    boolean[] used;
    void backtracking(int[] candidates, int target,int sum,int startIndex,boolean[] used)
  • 2.递归终止条件

终止条件为 sum > target 和 sum == target。

       if (sum > target) { // 这个条件其实可以省略
            return;
       }
        if(sum == target){
            result.add(new ArrayList<>(path));
            return;
        }

sum > target 这个条件其实可以省略,因为在递归单层遍历的时候,会有剪枝的操作

  • 3.单层搜索的逻辑

要去重的是“同一树层上的使用过”,如何判断同一树层上元素(相同的元素)是否使用过了呢。

如果candidates[i] == candidates[i - 1] 并且 used[i - 1] == false,就说明:前一个树枝,使用了candidates[i - 1],也就是说同一树层使用过candidates[i - 1]。

此时for循环里就应该做continue的操作。
在这里插入图片描述
我在图中将used的变化用橘黄色标注上,可以看出在candidates[i] == candidates[i - 1]相同的情况下:
used[i - 1] == true,说明同一树枝candidates[i - 1]使用过
used[i - 1] == false,说明同一树层candidates[i - 1]使用过
为什么 used[i - 1] == false 就是同一树层呢,因为同一树层,used[i - 1] == false 才能表示,当前取的 candidates[i] 是从 candidates[i - 1] 回溯而来的。
而 used[i - 1] == true,说明是进入下一层递归,去下一个数,所以是树枝上,如图所示:
在这里插入图片描述
那么单层搜索的逻辑代码如下:

        for(int i = startIndex;i<candidates.length && sum + candidates[i] <= target;i++){
            // used[i - 1] == true,说明同一树枝candidates[i - 1]使用过
            // used[i - 1] == false,说明同一树层candidates[i - 1]使用过
            // 要对同一树层使用过的元素进行跳过
            if(i>0 && candidates[i] == candidates[i-1] && !used[i-1]){
                continue;
            }
            path.add(candidates[i]);
            sum += candidates[i];
            used[i] = true;
            backtracking(candidates,target,sum,i+1,used);  // 和39.组合总和的区别1,这里是i+1,每个数字在每个组合中只能使用一次
            path.remove(path.size()-1);
            sum -= candidates[i];
            used[i] = false;
        }

整体代码

class Solution {
    ArrayList<List<Integer>> result = new ArrayList<>();  // 存放组合集合
    ArrayList<Integer> path = new ArrayList<>();   // 符合条件的组合
    boolean[] used;
    public List<List<Integer>> combinationSum2(int[] candidates, int target) {
        if(candidates == null || candidates.length == 0){
            return result;
        }
        used = new boolean[candidates.length];
        // 首先把给candidates排序,让其相同的元素都挨在一起。
        Arrays.sort(candidates);
        backtracking(candidates,target,0,0,used);
        return result;
    }

    public void backtracking(int[] candidates, int target,int sum,int startIndex,boolean[] used){
        if(sum == target){
            result.add(new ArrayList<>(path));
            return;
        }
        for(int i = startIndex;i<candidates.length && sum + candidates[i] <= target;i++){
            // used[i - 1] == true,说明同一树枝candidates[i - 1]使用过
            // used[i - 1] == false,说明同一树层candidates[i - 1]使用过
            // 要对同一树层使用过的元素进行跳过
            if(i>0 && candidates[i] == candidates[i-1] && !used[i-1]){
                continue;
            }
            path.add(candidates[i]);
            sum += candidates[i];
            used[i] = true;
            backtracking(candidates,target,sum,i+1,used);  // 和39.组合总和的区别1,这里是i+1,每个数字在每个组合中只能使用一次
            path.remove(path.size()-1);
            sum -= candidates[i];
            used[i] = false;
        }

    }
}

在这里插入图片描述

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

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

相关文章

keepalived+LVS配置详解

keepalivedLVS配置详解keepalived简介keepalived的应用场景keepalived工作原理VRRP协议核心组件分层工作工作状态LVS简介LVS三种模式NAT模式(网络地址映射)IPTUN模式(IP隧道)DR模式(直接路由)三种模式对比keepalivedLVS配置1.master配置2. keepalived配置文件3 修改keepalived配…

做主管如何规范测试团队

当你来到一个项目不规范的技术团队&#xff0c;你会怎么处理呢? 问题 Testing 流程不规范 没有需求评审和设计评审&#xff0c;需求经常是业务或者项目经理直接跟开发提&#xff0c;有时候开发自己都不明白需求&#xff0c;糊里糊涂地就要开发&#xff0c;也没有设计评审&…

插画师培训怎么选,5大插画师培训班排名

插画师培训哪里好&#xff0c;给大家推荐5大插画师培训班排名&#xff0c;各有优势和特色&#xff0c;提供大家选择&#xff01; 一&#xff1a;5大插画师培训班排名 1、轻微课&#xff08;五颗星&#xff09; 主打课程有日系插画、游戏原画、古风插画、动漫漫画&#xff0c;以…

UI自动化测试、接口测试等自动化测试策略

今天跟大家介绍UI测试、接口测试、单元测试主要内容&#xff0c;以及每种测试花费时间讨论。 UI测试【Selenium】 UI测试是最接近软件真实用户使用行为的测试类型。通常是模拟真实用户使用软件的行为&#xff0c;即模拟用户在软件界面上的各种操作&#xff0c;并验证这些操作对…

江苏专转本如何事半功倍的备考

专转本如何事半功倍的备考 一个人学习成绩的优劣取决于他的学习能力&#xff0c;学习能力包括三个要素&#xff1a;规范的学习行为&#xff1b;良好的学习习惯&#xff1b;有效的学习方法。有了规范的学习行为才能培养出良好的学习习惯&#xff0c;形成了良好的学习习惯就会形成…

Android - 代码生成远程依赖库(阿里云)

一、注册 没有注册过阿里云且没有实名认证的点这里&#xff1a;阿里云官网 二、查看库 阿里云制品仓库Packages &#xff08;注&#xff1a;如果没有创建企业或个人使用&#xff0c;按照提示&#xff0c;选个人使用&#xff09; 三、选择类型 选择其中一个&#xff08;两…

问题解决篇 | Win11网络连接上了但是无法上网(修改DNS弹出框框“出现问题”,如何通过网络检测确定并修复网络问题)

目录 问题 网络诊断 Win i 打开设置 搜索“查找并修复网络问题”并点击 "远程计算机或设备将不接受连接" 解决办法&#xff1a; Win R&#xff0c;输入 inetcpl.cpl &#xff0c;点击确定&#xff0c;打开Internet选项 选择“连接” 点击“局域网设置” 三个…

vscode下使用arduino插件开发ESP32 Heltec WiFi_Kit_32_V3

下载vsCode 添加 arduino 插件 在Arduino IDE 中添加开发板&#xff0c;注意只能用右侧的开发板管理器添加&#xff0c;自己下载之后复制进去的IDE认&#xff0c;但是vsCode不认&#xff0c;搜索ESP32 第一个库里面只有到V2的&#xff0c;没有V3&#xff0c;要安装下面那个 H…

CDH 6.3.2启用HDFS高可用

启用原因 CDH 6.3.2平台即将用于生产&#xff0c;生产平台几乎需要高可用平台&#xff0c;故需要升级CDH中的HDFS为HA。 启用准备 CDH已经成功安装并正常使用CMS的管理员账号正常登陆 HDFS启用HA 登陆CMS系统->选择HDFS服务->点击进入到HDFS服务详情页面&#xff0c…

CRC冗余校验的原理和FPGA实现思路

CRC校验码&#xff0c;顾名思义是用于校验的。它可以用于检测数据传输过程中是否出现错误&#xff08;某些位&#xff0c;或某几位&#xff0c;或者某块区域位错误&#xff09;&#xff0c;反正 可以知道数据出错了&#xff0c;但是不能纠错。 CRC校验&#xff0c;本质上是模2…

VIIRS-NPP夜间灯光遥感数据下载和预处理

VIIRS-NPP夜间灯光遥感数据下载和预处理 月和年合成产品下载网站 日数据下载网站 一、下载shp掩膜文件 下载好月合成产品后&#xff0c;在这个网站上下载矢量地图&#xff0c; 点击复制按钮&#xff0c;来到这个网站&#xff0c;ctrl v粘贴 点击右上角Export&#xff0c;…

【阿旭机器学习实战】【31】股票价格预测案例--线性回归

【阿旭机器学习实战】系列文章主要介绍机器学习的各种算法模型及其实战案例&#xff0c;欢迎点赞&#xff0c;关注共同学习交流。 注:本文模型结果不好&#xff0c;仅做学习参考使用&#xff0c;提供思路。了解数据处理思路,训练模型和预测数值的过程。 目录1. 读取数据K线图绘…

解决一打开IE浏览器就自动跳转到Edge浏览器的问题

问题说明&#xff1a; 打开Internet Explorer浏览器后会自动跳转到Microsoft Edge浏览器。 解决方法&#xff1a; 打开控制面板&#xff0c;选择“Internet选项”&#xff0c;选择【高级】选项卡&#xff0c;取消勾选“启用第三方浏览器扩展*”即可。

Java之前缀和算法

一.前缀和 1.前缀和介绍 前缀和,顾名思义,就是前n项相加之和,和我们高中时候学习的数列中的一个含义 例如一个等差数组n,那他的前n项和 也可知道- 2.编程中的前缀和 对于一个数组nums,也可以很容易求出它的前缀和数组 public int[] prefix(int[] nums) {int[] prefix …

01 | TDengine3.0部署

1 TDengine简介 TDengine 是一款开源、高性能、云原生的时序数据库&#xff0c;且针对物联网、车联网、工业互联网、金融、IT 运维等场景进行了优化。TDengine 的代码&#xff0c;包括集群功能&#xff0c;都在 GNU AGPL v3.0 下开源。除核心的时序数据库功能外&#xff0c;TD…

因子的有效性检验(IC)

使用神经网络的预测值作为因子载荷&#xff08;因子暴露&#xff0c;因子值 factor&#xff09;时&#xff0c; 我们需要知道这个因子是否是有效的&#xff0c;所以要做因子的有效性检验。 当前的学术论文给出的IC&#xff0c; rankIC 这些都是属于判断因子是否有效的metric 因…

Linux系统安装Nginx常见报错问题

安装Nginx从nginx官网下载所需版本的nginx&#xff0c;http://nginx.org/下载之后&#xff0c;将安装包上传到linux系统指定路径解压文件&#xff0c;tar -zxvf nginx-1.22.1.tar.gz &#xff08;此处用1.22.1版本为例&#xff09;进入安装包目录&#xff0c;cd nginx-1.22.1执…

面试了字节、美团、腾讯等30几家公司后,才知道软件测试面试全是这个套路......

一、Linux系统应用和环境配置&#xff1a; 1、Linux系统的操作命令给我说10个&#xff0c;一般用什么工具远程连接Linux服务器&#xff1f; 2、Linux中的日志存储在哪里&#xff1f;怎么查看日志内容&#xff1f; 3、Linux中top和ps命令的区别&#xff1f; 4、Linux命令运行…

【极海APM32替代笔记】HAL库Flash读写操作及配置

【极海APM32替代笔记】HAL库Flash读写操作及配置 在keil里面的默认工程配置中 Flash分配地址 程序部分为0x0800 0000到0x0810 0000 总共是0x0010 0000的大小 也就是1048576Byte 1024KB 1MB 而实际上程序部分大小应该要看硬件手册来确定 可以通过配置keil工程中size的大小 来确…

改进YOLO系列 | YOLOv5/v7 更换骨干网络之 MobileNeXt

重新思考瓶颈结构以实现高效移动网络设计 倒置残差块成为了移动网络架构设计的主流。它通过引入学习倒置残差和使用线性瓶颈的两个设计规则,改变了经典的残差瓶颈。在本文中,我们重新思考了这种设计改变的必要性,并发现它可能会带来信息丢失和梯度混淆的风险。因此,我们提出…