leetCode 90.子集 II + 回溯算法 + 图解 + 笔记

给你一个整数数组 nums ,其中可能包含重复元素,请你返回该数组所有可能的子集(幂集)。

解集 不能 包含重复的子集。返回的解集中,子集可以按 任意顺序 排列

示例 1:

输入:nums = [1,2,2]
输出:[[],[1],[1,2],[1,2,2],[2],[2,2]]

示例 2:

输入:nums = [0]
输出:[[],[0]]

  • 本题其实就是子集(leetCode 78.子集 + 回溯算法 + 图解 + 笔记)和组合总和 II (leetCode 40.组合总和 II + 回溯算法 + 剪枝 + used数组 + 图解)这两道题目的一个完美结合

 >>问题思考(O_O)?

1).什么是“去重”

  • “去重”:就是使用过的元素不能重复选取了

2).何为“树枝去重”“树层去重”?(代码随想录Carl老师自创的名词)

把组合问题抽象为树形结构used(“使用过”)在这个树形结构上是有两个维度的,一个维度表示是同一树枝上使用过,一个维度表示是同一树层上使用过

来看题目要求:“集合(数组nums)有重复元素,但还不能有重复的组合 ”。

例如{1,2,2},仅仅是两个元素的数值相同,并没有重复使用同一个元素。那分别是不同的两个元素,那它就是合法的,所以说树枝上前面取了2,后面我还能不能取2呢?可以的,因为它仅仅是你这两个元素数值都是2而已,但其实取的是两个不同的元素。所以说树枝上取了重复数值的元素(是两个不同的元素)可不可以?可以的,没问题(o´ω`o)و

但我树层上能不能取重复数值的元素呢?因为树层上你前面取2,后面取2,你得到的子集,它注定就是重复的。所以说树层上相邻两个元素(数值相同)重复选取的话,它得到的子集就是重复的子集。

  • 故去重的是同一树层上的“使用过”是不同组合里的元素,而对于同一树枝上的都是一个组合里的元素,不用去重。 
  • 强调注意:在树层去重时,需要对数组排序

(3)收获结果

子集问题组合问题分割问题都可以抽象成一棵树,不同的是:

  • 组合问题和分割问题都是收集树形结构中的叶子节点的结果
  • 子集问题收集树形结构中的所有节点的结果

>>回溯三部曲:

1).确定回溯函数参数

  • path来收集符合条件的结果
  • result 保存 path,作为结果集
  • startIndex 来控制for循环的起始位置
  • used 是bool型数组,用来记录同一树枝上的元素是否使用过
vector<vector<int>> result;
vector<int> path;
void backtracking(vector<int>& nums,vector<bool>& used,int startIndex) 

2).递归的终止条件(本题可以不写)

if(startIndex>=nums.size()) return;

 3).单层搜索的逻辑

去重逻辑if( i>0 && nums[i] == nums[i - 1] && used[i - 1] == false),表示前一个树枝,使用了nums[i - 1],也就是说同一树层使用过nums[i - 1]。那么此时 for 循环 里通过 continue 操作跳过此种情况的递归

for(int i=startIndex;i<nums.size();i++) {
    if(i>0 && nums[i]==nums[i-1] && used[i-1]==false) {
        continue;
    }
    ......
}

思考(O_O)?为啥used[i-1] == false能表示同一树层 nums[i-1] 使用过这种情况呢?

  • 是因为在同一树层used[i-1] == false 能表示当前取的nums[i]是从nums[i-1]回溯而来的。used[i]==true,表示进入下一层递归,取下一个数,所以在树枝上

C++代码: 

class Solution {
public:
    vector<vector<int>> result;
    vector<int> path;
    
    void backtracking(vector<int>& nums,vector<bool>& used,int startIndex) {
        result.push_back(path);
        // if(startIndex>=nums.size()) return;
        for(int i=startIndex;i<nums.size();i++) {
            if(i>0 && nums[i]==nums[i-1] && used[i-1]==false) {
                continue;
            }
            used[i]=true;
            path.push_back(nums[i]);
            backtracking(nums,used,i+1);
            used[i]=false;
            path.pop_back();
        }
    }
    vector<vector<int>> subsetsWithDup(vector<int>& nums) {
        vector<bool> used(nums.size(),false);
        sort(nums.begin(), nums.end()); // 去重需要排序
        backtracking(nums,used,0);
        return result;
    }
};
  • 时间复杂度: O(n * 2^n)
  • 空间复杂度: O(n)

参考文章和推荐视频:

代码随想录 (programmercarl.com)icon-default.png?t=N7T8https://www.programmercarl.com/0090.%E5%AD%90%E9%9B%86II.html#%E6%80%9D%E8%B7%AF回溯算法解决子集问题,如何去重?| LeetCode:90.子集II_哔哩哔哩_bilibiliicon-default.png?t=N7T8https://www.bilibili.com/video/BV1vm4y1F71J/?spm_id_from=333.788&vd_source=a934d7fc6f47698a29dac90a922ba5a3

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

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

相关文章

基于CNN对彩色图像数据集CIFAR-10实现图像分类--keras框架实现

项目地址&#xff08;kaggle&#xff09;&#xff1a;基于CNN对彩色图像数据集CIFAR-10实现图像分类--keras | Kaggle 项目地址&#xff08;Colab&#xff09;&#xff1a;https://colab.research.google.com/drive/1gjzglPBfQKuhfyT3RlltCLUPgfccT_G9 导入依赖 在tensorflow…

第一百八十八回 分享三个使用TextField的细节

文章目录 1. 概念介绍2. 使用方法2.1 修改组件的填充颜色2.2 修改组件的高度2.3 给组件添加圆角3. 示例代码4. 内容总结我们在上一章回中介绍了"DropdownButton组件"相关的内容,本章回中将介绍**TextField组件的细节.**闲话休提,让我们一起Talk Flutter吧。 1. 概念…

EasyRecovery易恢复2024最新免费版电脑数据恢复软件功能介绍

EasyRecovery从&#xff08;易恢复2024&#xff09;支持恢复不同存储介质数据&#xff0c;在Windows中恢复受损和删除文件,以及能检索数据格式化或损坏卷&#xff0c;甚至还可以从初始化磁盘。同时&#xff0c;你只需要最简单的操作就可以恢复数据文件&#xff0c;如&#xff1…

YITH Product Shipping for WooCommerce商城产品配送运输插件

点击访问原文 YITH Product Shipping for WooCommerce商城产品配送运输插件 - 易服客工作室 YITH Product Shipping for WooCommerce商城产品配送运输插件根据商店的每个产品处理不同的运费&#xff0c;例如您可以为每个州、地区或城市设置不同的费用。 根据店铺的单品处理不…

搭建 ebpf 开发测试环境

0 内容说明 这部分主要讲述了如何通过官网学习ebpf&#xff0c;以及如何搭建自己的ebpf开发测试环境&#xff0c;主要是需要安装哪些工具链。 1 ebpf在线学习 ebpf官网中提供了一个快速在线学习ebpf的路径&#xff0c;在这个学习平台中一共有两项学习内容&#xff0c;一个是…

在Spring Boot中隔离@Async异步任务的线程池

在异步任务执行的时候&#xff0c;我们知道其背后都有一个线程池来执行任务&#xff0c;但是为了控制异步任务的并发不影响到应用的正常运作&#xff0c;我们需要对线程池做好相关的配置&#xff0c;以防资源过度使用。这个时候我们就考虑将线程池进行隔离了。 那么我们为啥要…

高校人员信息管理系统C++

代码&#xff1a;https://mbd.pub/o/bread/ZZeZk5lx 一、基本内容论述 1、问题描述 某高校有四类员工&#xff1a;教师、实验员、行政人员、教师兼行政人员&#xff1b;共有的信息包括&#xff1a;编号、姓名、性别、年龄等。其中&#xff0c;教师还包含的信息有&#xff1a;所…

2023年GopherChina大会-核心PPT资料下载

一、峰会简介 自 Go 语言诞生以来&#xff0c;中国便是其应用最早和最广的国家之一&#xff0c;根据 Jetbrains 在 2021 年初做的调查报告&#xff0c;总体来说目前大概有 110 万专业的开发者 选择 Go 作为其主要开发语言。就其全球分布而言, 居住在亚洲的开发者最多&#xff…

矩阵元素求和:按行、按列、所有元素np.einsum()

【小白从小学Python、C、Java】 【计算机等考500强证书考研】 【Python-数据分析】 矩阵元素求和&#xff1a; 按行、按列、所有元素 np.einsum() [太阳]选择题 下列说法正确的是&#xff1a; import numpy as np A np.array([[1, 2],[3, 4]]) print("【显示】A") p…

为何要3次握手?TCP协议的稳定性保障机制

&#x1f680; 作者主页&#xff1a; 有来技术 &#x1f525; 开源项目&#xff1a; youlai-mall &#x1f343; vue3-element-admin &#x1f343; youlai-boot &#x1f33a; 仓库主页&#xff1a; Gitee &#x1f4ab; Github &#x1f4ab; GitCode &#x1f496; 欢迎点赞…

绝地求生在steam叫什么?

绝地求生在Steam的全名是《PlayerUnknowns Battlegrounds》&#xff0c;简称为PUBG。作为一款风靡全球的多人在线游戏&#xff0c;PUBG于2017年3月23日正式上线Steam平台&#xff0c;并迅速成为一部热门游戏。 PUBG以生存竞技为核心玩法&#xff0c;玩家将被投放到一个辽阔的荒…

布林线BOLL的实战应用技巧

一、认识布林线BOLL 布林线BOLL&#xff0c;又称布林带&#xff0c;是股市中非常常用的一个技术指标。 以金斗云智投电脑版软件为例&#xff0c;任意打开一支个股&#xff0c;选择BOLL指标&#xff0c;在K线区域就可以看到上中下排列的3条线&#xff0c;这3条线就组成了布林带。…

【Three.js】创建CAD标注线

目录 &#x1f4d6;前言 &#x1f41e;创建箭头对象 &#x1f42c;创建文字 &#x1f47b;箭头两端的线段 ✈️封装方法 &#x1f4d6;前言 CAD标注线在工程和制造领域中被广泛用于标记零部件、装配体和机械系统的尺寸、距离、角度等信息。它们帮助工程师和设计师更好地理…

web自动化 -- selenium及应用

selenium简介 随着互联网的发展&#xff0c;前端技术不断变化&#xff0c;数据加载方式也不再是通过服务端渲染。现在许多网站使用接口或JSON数据通过JavaScript进行渲染。因此&#xff0c;使用requests来爬取内容已经不再适用&#xff0c;因为它只能获取服务器端网页的源码&am…

计算机网络体系的形成

目录 1、开放系统互连参考模型OSI/RM 2、两种国际标准 3、协议与划分层次 4、网络协议的三要素 5、划分层次 &#xff08;1&#xff09;文件发送模块使两个主机交换文件 &#xff08;2&#xff09;通信服务模块 &#xff08;3&#xff09;接入网络模块 6、分层带来的好…

Linux下Python调用C语言

一&#xff1a;Python调用C语言场景 1&#xff0c;已经写好的C语言代码&#xff0c;不容易用Python实现&#xff0c;想直接通过Python调用写好的C语言代码 2&#xff0c;C比Python快&#xff08;只是从语言层面&#xff0c;不能绝对说C程序就是比Python快&#xff09; 3&…

docker配置redis插件

docker配置redis插件 运行容器redis_6390 docker run -it \ --name redis_6390 \ --privileged \ -p 6390:6379 \ --network wn_docker_net \ --ip 172.18.12.19 \ --sysctl net.core.somaxconn1024 \ -e TIME_ZONE"Asia/Shanghai" -e TZ"Asia/Shanghai"…

电磁兼容EMC理论基础汇总

目录 0. 序言 1. EMC的基础介绍 1.1 EMC电磁兼容的定义 1.2 EMC的重要性 1.3 EMC的三要素 2. 库仑定律 3. 趋肤效应与趋肤深度 4. 电阻抗公式 4.1 电阻 4.2 容抗 4.3 感抗 4.4 电路元件的非理想性 5. 麦克斯韦方程组 5.1 高斯磁定律 5.2 高斯定律 5.3 法拉…

【FPGA】Verilog:二进制并行加法器 | 超前进位 | 实现 4 位二进制并行加法器和减法器 | MSI/LSI 运算电路

Ⅰ. 前置知识 0x00 并行加法器和减法器 如果我们要对 4 位加法器和减法器进行关于二进制并行运算功能&#xff0c;可以通过将加法器和减法器以 N 个并行连接的方式&#xff0c;创建一个执行 N 位加法和减法运算的电路。 4 位二进制并行加法器 4 位二进制并行减法器 换…

YoloV8改进策略:Swift Parameter-free Attention,无参注意力机制,超分模型的完美迁移

摘要 https://arxiv.org/pdf/2311.12770.pdf https://github.com/hongyuanyu/SPAN SPAN是一种超分网络模型。SPAN模型通过使用参数自由的注意力机制来提高SISR的性能。这种注意力机制能够增强重要信息并减少冗余,从而在图像超分辨率过程中提高图像质量。 具体来说,SPAN模…