【组合回溯递归】【树层去重used标记】Leetcode 40. 组合总和 II

【组合回溯递归】【树层去重used标记】Leetcode 40. 组合总和 II

    • 解法 组合问题常用解法 + 树层去重

---------------🎈🎈40. 组合总和 II 题目链接🎈🎈-------------------
在这里插入图片描述

解法 组合问题常用解法 + 树层去重

在这里插入图片描述

问题描述:(数组candidates)有重复元素,但还不能有重复的组合
操作:去重的是“同一树层上的使用过的元素”
核心:加入一个used数组,去重时结合:前后数字相同的判断 + used[i-1]未被使用的判断,若成立则continue当前for遍历

如果candidates[i] == candidates[i - 1]
并且 used[i - 1] == false(即前一个元素没有被使用时)
此时for循环里就应该做continue的操作。

说明:

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,说明是进入下一层递归,取下一个数,所以是树枝上

时间复杂度O(N)
空间复杂度O(N)

class Solution {
    List<List<Integer>> result = new ArrayList<>();
    List<Integer> temp = new ArrayList<>();

    public List<List<Integer>> combinationSum2(int[] candidates, int target) {
        Arrays.sort(candidates);
        int[] used = new int[candidates.length]; // 初始化一个used数组 均为0, 表示都没有使用
        helper(candidates,target,0,0,used);
        return result;

    }
    public void helper(int[] candidates, int target, int startnum, int sum, int[] used){
        // 终止条件
        if(sum==target){ 
            result.add(new ArrayList<>(temp));
        }
        if(sum>target){
            return;
        }

        // 树层去重
        
        for(int i = startnum; i<candidates.length; i++){
            // 当前面的一个元素和现在的元素相同,且前面一个元素并未被使用的时候,跳过(因为所有可能都已经被前面的元素查找过了)
            if(i>0 && used[i-1]!=1 && candidates[i] == candidates[i-1]){  
                continue;
            }
            used[i] = 1; // 置为一:标志着第i个元素被使用
            sum+=candidates[i];
            temp.add(candidates[i]);
            helper(candidates,target,i+1,sum,used); // 递归
            temp.removeLast();
            sum-=candidates[i];
            used[i] = 0; // 回溯恢复

        }
    }
}      

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

GIS人必备神器降临!快速搞定洪水淹没分析!ArcGIS AddIn无源淹没分析插件!

最近有很多小伙伴给我发私信&#xff0c;想使用我开发的一款基于无源淹没分析算法对洪水淹没进行分析的GIS插件。大部分小伙伴是因为看了我之前发的一个讲解洪水淹没分析算法的视频&#xff0c;在视频中我给大家展示了给某高校水利课题组开发的两款用于洪水淹没分析的插件&…

CentOS 7 基于开源项目制作openssh 9.7p1二进制rpm包(内含ssh-copy-id、显示openssl版本信息)—— 筑梦之路

可参考之前的文章&#xff1a;CentOS 5/6/7 基于开源项目制作openssh 9.6p1 rpm包—— 筑梦之路_centos6 openssh9.6rpm-CSDN博客 2024年3月12日 植树节制作&#xff0c;相关文件见我的资源

iOS全局自动化代码混淆工具!支持cocoapod组件代码一并混淆

​ 目录 摘要 引言 Ipa Guard 怎么使用 ipaguard启动界面 ipaguard代码混淆界面 资源文件混淆界面 重签名界面 总结 摘要 Ipa Guard是一款强大的iOS ipa混淆工具&#xff0c;能够对ipa文件进行混淆加密&#xff0c;保护代码、代码库和资源文件&#xff0c;降低代码可…

灯塔:CSS笔记(3)

盒子模型&#xff1a; 盒子的概念 1.页面中的每一个标签都可以看做是一个“盒子”&#xff0c;通过盒子的视角更方便的进行布局 2.浏览器在渲染&#xff08;显示&#xff09;网页时&#xff0c;会将网页中的元素看作是一个个矩形区域&#xff0c;我们也形象的称之为盒子 盒…

混合输入矩阵乘法的性能优化

作者 | Manish Gupta OneFlow编译 翻译&#xff5c;宛子琳、杨婷 AI驱动的技术正逐渐融入人们日常生活的各个角落&#xff0c;有望提高人们获取知识的能力&#xff0c;并提升整体生产效率。语言大模型&#xff08;LLM&#xff09;正是这些应用的核心。LLM对内存的需求很高&…

14.WEB渗透测试--Kali Linux(二)

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 内容参考于&#xff1a; 易锦网校会员专享课 上一个内容&#xff1a;13.WEB渗透测试--Kali Linux&#xff08;一&#xff09;-CSDN博客 netcat简介内容:13.WE…

Java项目:基于Springboot+vue实现的付费自习室系统设计与实现(源码+数据库+毕业论文)附含微信小程序端代码

一、项目简介 本项目是一套基于Springbootvue实现的付费自习室系统 包含&#xff1a;项目源码、数据库脚本等&#xff0c;该项目附带全部源码可作为毕设使用。 项目都经过严格调试&#xff0c;eclipse或者idea 确保可以运行&#xff01; 该系统功能完善、界面美观、操作简单、…

​《宏伟世纪》在 TheSandbox 中带来虚拟苏丹体验!

《宏伟世纪》&#xff08;Magnificent Century&#xff09;与 The Sandbox 合作&#xff0c;将戏剧带入数字领域&#xff01;这部土耳其历史小说电视连续剧以苏丹苏莱曼大帝和许蕾姆苏丹的生平为原型&#xff0c;曾在 140 多个国家和地区播出&#xff0c;收视率超过 5 亿&#…

设计模式一 ---单例设计模式(动力节点,JavaSE基础)

设计模式 1.什么是设计模式&#xff1f; 2.设计模式的分类 单例设计模式就是GoF模式中的一种。 3.GoF设计模式的分类&#xff1a; 单例设计模式&#xff1a; 顾名思义&#xff1a;单个实例的设计模式&#xff01;

2024 数字环保壁炉|AFIRE ™

2024年&#xff0c;数字和环保壁炉将站在现代性和环保尊重的交汇处。由制作的酒精壁炉和水离子水壁炉提供了将技术创新与生态承诺相结合的体验。为了打造您的装饰壁炉&#xff0c;真正的火焰&#xff0c;100%安全。 2024年&#xff0c;使用水壁炉运行的数字和环保壁炉。 水离…

职场人福音来了!微信机器人自动回复设置

微信消息太多&#xff0c;回复不过来&#xff1b;休息节假日没能及时回复客户消息&#xff1b;好友请求太多一个一个通过很麻烦…… 如果你也有这些烦恼&#xff0c;那么你一定要试试微信管理系统&#xff0c;能够让你实现微信自动会化回复。 1、自动通过好友 当有新的好友请…

算法刷题Day6 | 242.有效的字母异位词、349. 两个数组的交集、202. 快乐数、1. 两数之和

目录 0 哈希表 哈希函数1 有效的字母异位词1.1 string的回顾1.2 我的代码 2 两个数组的交集2.1 unordered_set 介绍2.2 我的解题&#xff08;set&#xff09; 3 快乐数3.1 我的解题&#xff08;set&#xff09; 4 两数之和4.1 暴力求解4.2 map的使用4.3 哈希表&#xff08;map&…

使用单片机和电流互感器对非正弦周期电流有效值测定

前言&#xff1a;使用单片机加电流互感器测量交流电路的电流&#xff0c;是非常常见的手段。最简单的方案就是直接使用采样电阻&#xff0c;整流滤波&#xff0c;再进入MCU的ADC进行转换&#xff0c;再通过软件滤波得到一个代表着电流大小的数值。对于电流保护功能来说&#xf…

如何从用户心理一步步挖掘用户需求?

为了更深入透彻挖掘用户需求&#xff0c;彻底满足用户的真实需求&#xff0c;我们可以从用户心理角度&#xff0c;一步步从方案级需求到问题级需求&#xff0c;再到人性级需求。 1、从方案级需求到问题级需求 方案级需求通常是指用户提出的具体解决方案或需求表述。这种需求往往…

一文彻底搞懂IO流

文章目录 1. 什么是IO流2. IO流原理3. IO流分类3.1 按数据类型分类3.2 按流的方向分类 4. IO流的使用场景5. 常用的IO流类5.1 字节流类5.2 字符流类5.3 输入输出流类5.4 字符输出流类 1. 什么是IO流 Java对数据的操作是通过流的方式&#xff0c;IO是java中实现输入输出的基础&…

探索ChatGPT的前沿科技:解锁其在地理信息系统、气候预测、农作物生长等关键领域的创新应用

以ChatGPT、LLaMA、Gemini、DALLE、Midjourney、Stable Diffusion、星火大模型、文心一言、千问为代表AI大语言模型带来了新一波人工智能浪潮&#xff0c;可以面向科研选题、思维导图、数据清洗、统计分析、高级编程、代码调试、算法学习、论文检索、写作、翻译、润色、文献辅助…

Java高校学校校园排课系统设计与实现(Idea+Springboot+mysql)

博主介绍&#xff1a;黄菊华老师《Vue.js入门与商城开发实战》《微信小程序商城开发》图书作者&#xff0c;CSDN博客专家&#xff0c;在线教育专家&#xff0c;CSDN钻石讲师&#xff1b;专注大学生毕业设计教育和辅导。 所有项目都配有从入门到精通的基础知识视频课程&#xff…

【wine】vb程序自定义窗口最大化崩溃分析EXCEPTION_FLT_INEXACT_RESULT 失败

故障现象&#xff0c;wine运行windows应用程序,点击最大化按钮崩溃&#xff0c;wine日志如下 02a8:err:ole:apartment_getclassobject DllGetClassObject returned error 0x80040111 for dll L"C:\\windows\\system32\\msxml2.dll" 029c:err:ole:com_get_class_obje…

蓝桥杯练习系统(算法训练)ALGO-977 P0805大数乘法

资源限制 内存限制&#xff1a;256.0MB C/C时间限制&#xff1a;1.0s Java时间限制&#xff1a;3.0s Python时间限制&#xff1a;5.0s 当两个比较大的整数相乘时&#xff0c;可能会出现数据溢出的情形。为避免溢出&#xff0c;可以采用字符串的方法来实现两个大数之间的…

C++ 哈希

目录 1. 哈希概念 2. 哈希冲突 3. 哈希函数 4. 哈希冲突解决 4.1 闭散列 4.2 开散列 4.3 对于哈希表的补充 5. 开散列与闭散列比较 6. 哈希表的模拟实现以及unorder_set和unorder_map的封装 1. 哈希概念 顺序结构以及平衡树中&#xff0c;元素关键码与其存储位置之间…