力扣第90题 子集|| 去重问题 c++ 注释版

题目

90. 子集 II

中等

相关标签

位运算   数组   回溯

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

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

示例 1:

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

示例 2:

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

提示:

  • 1 <= nums.length <= 10
  • -10 <= nums[i] <= 10

思路和解题方法

  1. 首先,定义了私有成员变量resultpath,分别用于存储最终结果和当前路径。result是一个二维向量,每个元素是一个一维向量,表示一个子集。path是一个一维向量,表示当前路径。
  2. 接下来是私有函数backtracking,它是实现回溯算法的核心部分。回溯算法是一种通过穷举所有可能的搜索方式,然后根据条件进行剪枝的算法。在这里,回溯算法用于生成给定数组的所有子集,并避免生成重复的子集。
  3. backtracking函数中,首先将当前路径path加入到结果集result中,即将当前路径作为一个子集加入结果集。
  4. 接着,使用循环从startIndex开始遍历数组nums的元素。对于每个元素nums[i],判断其是否与前一个元素相同且不是起始位置。如果是,则跳过该元素,以避免生成重复的子集。这个判断条件if (i > startIndex && nums[i] == nums[i-1])起到了去重的作用。
  5. 如果当前元素需要包含在子集中,则将其加入到当前路径path中。然后,递归调用backtracking函数,以处理下一个元素。递归调用时,将startIndex设置为i + 1,表示从当前元素的下一个元素开始进行处理。
  6. 当递归调用完成后,进行回溯操作。即将路径path中的当前元素移除,尝试其他选择,继续搜索其他子集。
  7. 最后,公共函数subsetsWithDup是对外的接口函数。它首先清空结果集result和路径path,以便重新计算子集。然后,对输入数组nums进行排序,以便处理重复元素的情况。排序后,调用backtracking函数,从索引0开始进行回溯搜索。最终,返回结果集result

复杂度

        时间复杂度:

                O(2^N * N)

        该代码的时间复杂度为 O(2^N * N),其中 N 是数组 nums 的长度。

在回溯函数 backtracking 中,我们遍历了所有可能的子集组合。每个元素都有两种状态:选中和不选中,因此总共有 2^N 种可能的子集。在每次添加到结果集中时,需要复制一份当前路径 path,并将其加入到结果集中,这个操作的时间复杂度是 O(N)。

因此,回溯函数的时间复杂度为 O(2^N * N)。

        空间复杂度

                O(N)

对于空间复杂度,主要耗用的是递归调用栈的空间。在最坏情况下,递归的深度可以达到 N,所以空间复杂度是 O(N)。另外,还需要额外的空间来存储结果集和当前路径,因此额外的空间复杂度是 O(N)。

c++ 代码

class Solution {
private:vector<vector<int>> result; // 存储最终结果的二维向量vector<int> path; // 存储当前路径的一维向量void backtracking(vector<int>& nums, int startIndex) {result.push_back(path); // 将当前路径加入结果集中for (int i = startIndex; i < nums.size(); i++) {if (i > startIndex && nums[i] == nums[i-1]) {continue; // 如果遇到重复的元素,则跳过,避免生成重复的子集}//重要 ,相邻两个去重path.push_back(nums[i]); // 将当前元素加入路径中backtracking(nums, i + 1); // 递归调用,处理下一个元素path.pop_back(); // 回溯,将当前元素移出路径,尝试其他选择}}public:vector<vector<int>> subsetsWithDup(vector<int>& nums) {result.clear(); // 清空结果集path.clear(); // 清空路径sort(nums.begin(), nums.end()); // 对数组进行排序,以便处理重复元素backtracking(nums, 0); // 调用回溯函数,从索引0开始搜索return result; // 返回最终的结果集}
};

分析

  if (i > startIndex && nums[i] == nums[i-1]) {continue; // 如果遇到重复的元素,则跳过,避免生成重复的子集}//重要 ,相邻两个去重

        代码是为了避免生成重复的子集而进行的判断和跳过操作。

        首先,根据题目要求,我们需要找到给定数组中所有不重复的子集。如果数组中存在重复的元素,并且我们在生成子集时不进行特殊处理,就有可能生成重复的子集。

在这段代码中,通过比较当前元素 nums[i] 和前一个元素 nums[i-1] 是否相等,来判断是否遇到重复的元素。为了确保判断的准确性和避免数组越界,还需要额外的条件 i > startIndex 来保证当前元素 nums[i] 不是起始位置的元素。

        如果发现相邻两个元素相等,就说明当前元素 nums[i] 与前一个元素 nums[i-1] 是重复的。为了避免生成重复的子集,我们直接使用 continue 关键字跳过当前循环,不将当前元素 nums[i] 加入到当前路径 path 中。

这样,当数组中有连续重复的元素时,我们只会选择其中的一个,从而避免了生成重复的子集。

        需要注意的是,在进行这一判断和跳过操作之前,必须确保数组 nums 是已经按照非降序排序的,这样才能保证重复的元素是相邻的。否则,不相邻的重复元素也可能被认为是重复的,导致错误结果。

        综上所述,这段代码通过比较当前元素与前一个元素是否相等,来判断是否遇到重复的元素,并通过 continue 关键字跳过重复元素,以避免生成重复的子集。

觉得有用的话可以点点赞,支持一下。

如果愿意的话关注一下。会对你有更多的帮助。

每天都会不定时更新哦  >人<  。

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

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

相关文章

中文编程开发语言工具开发的实际软件案例:称重管理系统软件

中文编程开发语言工具开发的实际软件案例&#xff1a;称重管理系统软件 中文编程开发语言工具开发的实际软件案例&#xff1a;称重管理系统软件&#xff0c;软件可以安装在电脑上&#xff0c;也可以安装在收银机上&#xff0c;支持触摸和鼠标点&#xff0c;想学编程可以关注系统…

【web前端】web前端设计入门到实战第一弹——html基础精华

前端 一&#xff1a;图片属性二&#xff1a;音频标签三&#xff1a; 视频标签四&#xff1a;链接标签五&#xff1a;列表标签5.1.无序列表5.2.有序列表3.自定义列表 六&#xff1a;表格6.1合并单元格 七&#xff1a;input标签八&#xff1a;select系列九&#xff1a; 文本域标签…

《软件方法》2023版第1章(10)应用UML的建模工作流-大图

DDD领域驱动设计批评文集 做强化自测题获得“软件方法建模师”称号 《软件方法》各章合集 1.4 应用UML的建模工作流 1.4.1 概念 我用类图表示建模工作流相关概念如图1-16。 图1-16 建模工作流相关概念 图1-16左侧灰色部分定义了“游戏规则”&#xff0c;右侧则是在“游戏规…

Canvas绘图学习笔记:画笔的路径与状态

beginPath beginPath表示开始一个路径&#xff0c;我们在上一章画弧的时候用到过好多次&#xff0c;他的API非常简单&#xff1a; context.beginPath(); 开始路径有2层意思&#xff0c;一个就是本次绘制的起点是新的&#xff08;不再是上次结束的点了&#xff09;&#xff0…

2021-9-25 美团售后服务系统后端一面【2024秋招】

1 实习 1.1 讲讲你做的一个需求&#xff0c;为什么这么做之类的 答&#xff1a; 1.2 什么是接线 1.3 什么的初始接线&#xff0c;和权威接线 答&#xff1a;初始接线是现状&#xff0c;权威是规划中的 1.4 为什么要做比较呢&#xff1f; 答&#xff1a;运维人员需要查看…

强大的下载管理器:Progressive Downloader for Mac

Progressive Downloader for Mac是一种强大的下载管理器&#xff0c;它可以帮助用户更快速、更稳定地下载文件。相比于其他下载工具&#xff0c;PD下载管理器具有很多独特的功能和优势&#xff0c;本文将对其进行详细推广。 在数字化时代&#xff0c;下载已成为我们日常工作中必…

pdf压缩文件怎么压缩最小?

pdf压缩文件怎么压缩最小&#xff1f;我们很多项目介绍或是学术的报告都是采用的这个pdf格式&#xff0c;那么我们在存储或是需要进行分享的时候&#xff0c;可能就会因为文件过大而导致无法打开或是发送了。那么就需要将其进行压缩。PDF文件压缩方法很多&#xff0c;pdf压缩文…

批量处理图像模板

以下是一个Python模板&#xff0c;用于批量处理图像并将处理后的图像保存在另一个文件夹中。在此示例中&#xff0c;将使用Pillow库来处理图像&#xff0c;可以使用其他图像处理库&#xff0c;根据需要进行修改。   首先&#xff0c;确保已经安装了Pillow库&#xff0c;可以使…

web前端面试-- http的各个版本的区别(HTTP/0.9、HTTP/1.0、HTTP/1.1、HTTP/2.0、HTTP/3.0)

本人是一个web前端开发工程师&#xff0c;主要是vue框架&#xff0c;整理了一些面试题&#xff0c;今后也会一直更新&#xff0c;有好题目的同学欢迎评论区分享 ;-&#xff09; web面试题专栏&#xff1a;点击此处 http的各个版本的区别 HTTP&#xff08;超文本传输协议&…

el-input: 把不符合正则校验的值动态清空,只保留符合的值

<el-input v-model"form.profit" placeholder"请输入授权专利新增利润" input"handleInput" clearable />/*** 不符合正则校验,清空*/const handleInput () > {if (form.value.profit) {if (!/^\d*\.?\d*$/.test(form.value.profit))…

hive往es映射表写数据报错

hive是基于Hadoop的一个数据仓库工具&#xff0c;用来进行数据提取、转化、加载&#xff0c;这是一种可以存储、查询和分析存储在Hadoop中的大规模数据的机制。hive数据仓库工具能将结构化的数据文件映射为一张数据库表&#xff0c;并提供SQL查询功能&#xff0c;能将SQL语句转…

JDK版本和Gradle版本配套关系

Java versionSupport for compiling/testing/…​Support for running Gradle 8 N/A 2.0 9 N/A 4.3 10 N/A 4.7 11 N/A 5.0 12 N/A 5.4 13 N/A 6.0 14 N/A 6.3 15 6.7 6.7 16 7.0 7.0 17 7.3 7.3 18 7.5 7.5 19 7.6 7.6 20 8.1 8.3 21 …

Elasticsearch7.9.3保姆级安装教程

Linux版本Elasticsearch版本(待安装)Kibana版本(待安装)CentOS 77.9.37.9.3 一、下载地址 1、官网下载 打开地址 https://www.elastic.co/cn/downloads/past-releases#elasticsearch&#xff0c;按如图所示选择对应版本即可 2、采用wget下载 为了不必要的麻烦&#xff0c;建…

【vscode编辑器插件】前端 php unity自用插件分享

文章目录 一篇一句前言前端vuegitphpunity后端其他待续完结 一篇一句 “思考是最困难的工作&#xff0c;这也许是为什么很少有人这样做。” - 亨利福特&#xff08;Henry Ford&#xff09; 前言 无论是什么语言&#xff0c;我都会选择使用vscode进行开发&#xff0c;我愿称v…

【Java基础】基础数据类型

1. 基础数据类型 类型占用存储空间表数范围包装类包装类缓存对象byte1字节8bit-128~127Byte-128~127short2字节-215~215-1Short-128~127int4字节-231~231-1&#xff08;约21亿&#xff09;Integer-128~127long8字节-263~263-1Long-128~127单精度float4字节-3.403E38 ~ 3.403E3…

麒麟kylinOS 2303制作自定义免交互安装镜像

原文链接&#xff1a;麒麟kylinOS 2303制作自定义免交互安装镜像 hello&#xff0c;大家好啊&#xff0c;今天给大家带来一篇麒麟kylinOS 2303制作自定义免交互ISO安装镜像的文章&#xff0c;内容相对来说比较简单&#xff0c;测试安装了一个360浏览器软件&#xff0c;后续复杂…

openstack 云主机 linux报 login incorrect

还未输入密码就提示login incorrect 不给输密码位置 完全不给输密码的机会 关机进入单用户 检查登录安全记录 vi /var/log/secure 发现 /usr/lib64/security/pam_unix.so 报错 将正常的机器提取/usr/lib64/security/pam_unix.so 比对MD5一致&#xff0c; 另外判断 libtir…

读《中国省级移动政务服务报告2023》

报告地址&#xff1a; 中国省级移动政务服务报告2022 https://www.digitalelite.cn/h-nd-7846.html 中国省级移动政务服务报告2023 中国省级移动政务服务报告2023 报告分为 引言、评估方法、概貌、指数、标杆、建言 六个部分。 一些思考 移动政务服务应用针对各省的常驻人口…

nginx重定向问题解决(rewrite or internal redirection cycle)

文章目录 错误日志和配置文件问题分析 错误日志和配置文件 访问日志文件 2023/10/15 07:13:48 [error] 30#30: *1 rewrite or internal redirection cycle while internally redirecting to "/index.html", client: 123.55.159.97, server: server_name, request: …