LeetCode(90):子集 II

Medium!

题目描述:

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

说明:解集不能包含重复的子集。

示例:

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

解题思路:

这道子集合之二是之前那道 Subsets 子集合 的延伸,这次输入数组允许有重复项,其他条件都不变,只需要在之前那道题解法的基础上稍加改动便可以做出来,我们先来看非递归解法,拿题目中的例子[1 2 2]来分析,根据之前 Subsets 子集合 里的分析可知,当处理到第一个2时,此时的子集合为[], [1], [2], [1, 2],而这时再处理第二个2时,如果在[]和[1]后直接加2会产生重复,所以只能在上一个循环生成的后两个子集合后面加2,发现了这一点,题目就可以做了,我们用last来记录上一个处理的数字,然后判定当前的数字和上面的是否相同,若不同,则循环还是从0到当前子集的个数,若相同,则新子集个数减去之前循环时子集的个数当做起点来循环,这样就不会产生重复了。

C++解法一:

 1 class Solution {
 2 public:
 3     vector<vector<int>> subsetsWithDup(vector<int> &S) {
 4         if (S.empty()) return {};
 5         vector<vector<int>> res(1);
 6         sort(S.begin(), S.end());
 7         int size = 1, last = S[0];
 8         for (int i = 0; i < S.size(); ++i) {
 9             if (last != S[i]) {
10                 last = S[i];
11                 size = res.size();
12             }
13             int newSize = res.size();
14             for (int j = newSize - size; j < newSize; ++j) {
15                 res.push_back(res[j]);
16                 res.back().push_back(S[i]);
17             }
18         }
19         return res;
20     }
21 };

整个添加的顺序为:

[]
[1]
[2]
[1 2]
[2 2]
[1 2 2]

 

对于递归的解法,根据之前 Subsets 子集合 里的构建树的方法,在处理到第二个2时,由于前面已经处理了一次2,这次我们只在添加过2的[2] 和 [1 2]后面添加2,其他的都不添加,那么这样构成的二叉树如下图所示:

 

复制代码
                        []        /          \        /            \     /              \[1]                []/       \           /    \/         \         /      \        [1 2]       [1]       [2]     []/     \     /   \     /   \    / \[1 2 2] [1 2]  X   [1]  [2 2] [2] X  []
复制代码

 

代码只需在原有的基础上增加一句话,while (S[i] == S[i + 1]) ++i; 这句话的作用是跳过树中为X的叶节点,因为它们是重复的子集,应被抛弃。

C++解法二:

 1 class Solution {
 2 public:
 3     vector<vector<int>> subsetsWithDup(vector<int> &S) {
 4         if (S.empty()) return {};
 5         vector<vector<int>> res;
 6         vector<int> out;
 7         sort(S.begin(), S.end());
 8         getSubsets(S, 0, out, res);
 9         return res;
10     }
11     void getSubsets(vector<int> &S, int pos, vector<int> &out, vector<vector<int>> &res) {
12         res.push_back(out);
13         for (int i = pos; i < S.size(); ++i) {
14             out.push_back(S[i]);
15             getSubsets(S, i + 1, out, res);
16             out.pop_back();
17             while (i + 1 < S.size() && S[i] == S[i + 1]) ++i;
18         }
19     }
20 };

整个添加的顺序为:

[]
[1]
[1 2]
[1 2 2]
[2]
[2 2]

转载于:https://www.cnblogs.com/ariel-dreamland/p/9159492.html

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

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

相关文章

MFC程序在其他机器运行

为了保证MFC程序能够在没有安装VS的机器上运行&#xff0c;可以采用如下方法。1. 单个的小程序&#xff0c;可以静态编译MFC&#xff0c;但不适用于有很多dll的工程。2. 拷贝VS安装目录Microsoft Visual Studio 11.0\VC\redist\x86\Microsoft.VC110.MFC下的4个文件和Microsoft …

ACM搜索题目总结

ACM搜索题目总结 格式说明&#xff1a;题目名后面列出个人此题的大致难度&#xff08;对菜鸟而言&#xff09; POJ 1069 -The Bermuda Triangle(难) http://acm.pku.edu.cn/JudgeOnline/problem?id1069 题意&#xff1a;用给定三角型填充六边形 解法&#xff1a;此题的思想上精…

JPA中按身份引用

在上一篇文章中 &#xff0c;我提到我选择通过其主键而不是类型来引用其他聚合。 在处理大型或复杂域模型时&#xff0c;我通常使用这种方法&#xff08;也称为断开域模型&#xff09;。 在这篇文章中&#xff0c;让我尝试进一步解释如何在JPA中完成它。 请注意&#xff0c;生成…

在idea下开发出现404错误

用idea开发时&#xff0c;我们一般要设置project strucure里的Modules-Sources,里面对应的有Sources,tests,Resources,Test Resources&#xff0c; Excluded。 同时也可以在maven的pom里面build标签里设置。 <resource><directory>src/main/webapp</directory&g…

MFC利用控制台输出调试信息的方法

VS2010中只要输入以下信息即可&#xff1a;editbin /SUBSYSTEM:CONSOLE $(OUTDIR)$(TargetName).exeVC6.0稍微复杂&#xff1a;打开菜单“Project”-“Setting”&#xff08;或者Alt-F7&#xff09;&#xff0c;打开选项卡“Post-builder step”&#xff08;Post-build步骤&…

一念成佛,一念成魔

一念成佛&#xff0c;一念成魔 前几天&#xff0c;因我与寝友的一次错误导致电脑系统崩溃&#xff0c;连开机都开不了了。可我发现我并不是很生气&#xff0c;只是用玩笑话调侃了他一下。后来想想&#xff0c;要是放在以前&#xff0c;我一定会大发脾气&#xff0c;几天都不去理…

Jquery操作基本筛选过滤器

<!DOCTYPE html> <html><head><meta charset"UTF-8"><title>层级选择器</title><link rel"stylesheet" href"../../css/style.css" type"text/css"/><script type"text/javascript…

nodejs微信小程序+python+PHP计算机网络在线考试系统-计算机毕业设计推荐

目 录 摘 要 I ABSTRACT II 目 录 II 第1章 绪论 1 1.1背景及意义 1 1.2 国内外研究概况 1 1.3 研究的内容 1 第2章 相关技术 3 2.1 nodejs简介 4 2.2 express框架介绍 6 2.4 MySQL数据库 4 第3章 系统分析 5 3.1 需求分析 5 3.2 系统可行性分析 5 3.2.1技术可行性&#xff1a;…

Visual C++利用互斥量同步线程实现文件读取进度条

忘了原文的位置了。 一、前言 文件读取进度条的实现可以有很多种方法,常用的是在读取文件的过程中隔一定时间向对话框发送消息以控制进度条的位置,但是这种方法很难确定隔多少时问发送一个消息,因为文件的大小是不确定的,时间间隔长了可能文件已经读取完了还没有发送消…

组件模块化使用

// 使用$attr可以直接在父元素上拿数据让子元素使用或者是孙元素使用 <template><div>props:{{name}},{{age}} 或者 {{$props[name]}},{{$props[age]}} <br>attrs: {{$attrs[gender]}} 在$attrs里面只会有props没有注册的属性</div> </template>…

jboss与nginx_JBoss BRMS与JasperReports进行报告

jboss与nginx介绍 Jasperreports是可免费下载的库&#xff0c;可用于为Java EE应用程序生成丰富的报告。 本指南还提供了使用Jasper iReport设计器生成报告模板的步骤。 软件需求 JBoss BRMS 5.3&#xff08;从客户门户网站http://access.redhat.com &#xff09; JasperRep…

VS2010发布、打包安装程序超全超详细

找不到原文链接 1、 在vs2010 选择“新建项目”“其他项目类型”“ Visual StudioInstaller “安装项目”&#xff1a; 命名为&#xff1a;Setup1 。 这是在VS2010中将有三个文件夹&#xff0c; 1.“应用程序文件夹”表示要安装的应用程序需要添加的文件&#xff1b; 2.“…

IntelliJ IDEA2017 激活方法 最新的

今天打开电脑&#xff0c;非常不幸&#xff0c;idea出问题了&#xff01;&#xff01;&#xff01;大部分人以前应该都是用的以下方法&#xff1a;1. 到网站 http://idea.lanyus.com/ 获取注册码2.填入下面的license server:http://intellij.mandroid.cn/   http://idea.imsx…

介绍HawkFX

如前所述&#xff0c; 我开始玩JRubyFX 。 对我来说&#xff0c;学习一些新的最佳方法可以解决用例&#xff0c;因此我开始为Hawkular创建库存浏览器。 为什么选择JRubyFX&#xff1f; 让我们首先从“什么是JRubyFX”开始&#xff1f; JRubyFX是通过JRuby引入Ruby世界的JavaFX…

C++ Unicode和ANSII转换

构造字符串和转换字符串是不一样的&#xff0c;构造字符串时往往是添加标记&#xff0c;这个过程其实是告诉编译器应该怎么在内存中存储&#xff1b;一旦构造好&#xff0c;对于内存中的一块地址&#xff0c;这些标记符就没用了&#xff0c;这个时候就得使用转换函数转换了。对…

创建win32 dll

新建项目->win32项目&#xff08;不是win32控制台&#xff09;->下一步中选择dll&#xff08;如果想生成lib&#xff0c;勾选导出符号&#xff09;。此时编译会生成对应的dll文件&#xff0c;但没有lib&#xff0c;只有有导出符号的时候才会生成lib文件。导出符号可以使用…

蓝桥杯 有几个星期日的问题.

1949年的国庆节&#xff08;10月1日&#xff09;是星期六。 今年&#xff08;2012&#xff09;的国庆节是星期一。那么&#xff0c;从建国到现在&#xff0c;有几次国庆节正好是星期日呢&#xff1f;只要答案&#xff0c;不限手段&#xff01;可以用windows日历&#xff0c;win…

storm问题汇总

1.删除了本地topology导致无法启动nimbus 删除storm的自定义的库中的数据 删除zookeeper中配置的dataDir中的数据 重启服务即可 转载于:https://www.cnblogs.com/ives/p/9165850.html

带有API网关的AWS Lambda

在上一篇文章中&#xff0c;我向您展示了如何创建和部署AWS Lambda。 我们将继续这项工作&#xff0c;并只考虑更新该lambda的代码。 我们还将使用AWS API Gateway将REST端点添加到AWS Lambda。 因此&#xff0c;在继续之前……&#xff08;如果尚未使用&#xff09;&#xff…

获取焦点

win32 API:HWND SetFocus&#xff08;HWND hWnd&#xff09;MFC直接CWnd::SetFocus();参数&#xff1a;hWnd&#xff1a;接收键盘输入的窗口指针。若该参数为NULL&#xff0c;则击键被忽略。返回值&#xff1a;若函数调用成功&#xff0c;则返回原先拥有键盘焦点的窗口句柄。若…