LeetCode:Subsets I II

Leetcode Subset I & II Problem 1: Subset I Given a set of distinct integers, S, return all possible subsets. Note: Elements in a subset must be in non-descending order. The solution set must not contain duplicate subs 阅读详情

求集合的所有子集问题

LeetCode:Subsets 

Given a set of distinct integers, S, return all possible subsets.

Note:

  • Elements in a subset must be in non-descending order.
  • The solution set must not contain duplicate subsets.

For example,
If S = [1,2,3], a solution is:

[
  [3],
  [1],
  [2],
  [1,2,3],
  [1,3],
  [2,3],
  [1,2],
  []
]                                                                                                             本文地址

分析:求集合的所有子集问题。题目要求子集中元素非递减序排列,因此我们先要对原来的集合进行排序。原集合中每一个元素在子集中有两种状态:要么存在、要么不存在。这样构造子集的过程中每个元素就有两种选择方法:选择、不选择,因此可以构造一颗二叉树,例如对于例子中给的集合[1,2,3],构造的二叉树如下(左子树表示选择该层处理的元素,右子树不选择),最后得到的叶子节点就是子集:

算法1:根据上面的启发,我们可以用dfs来得到树的所有叶子节点,代码如下:

复制代码
 1 class Solution {
 2 private:
 3     vector<vector<int> >res;
 4 public:
 5     vector<vector<int> > subsets(vector<int> &S) {
 6         // IMPORTANT: Please reset any member data you declared, as
 7         // the same Solution instance will be reused for each test case.
 8         //先排序,然后dfs每个元素选或者不选,最后叶子节点就是所有解
 9         res.clear();
10         sort(S.begin(), S.end());
11         vector<int>tmpres;
12         dfs(S, 0, tmpres);
13         return res;
14     }
15     void dfs(vector<int> &S, int iend, vector<int> &tmpres)
16     {
17         if(iend == S.size())
18             {res.push_back(tmpres); return;}
19         //选择S[iend]
20         tmpres.push_back(S[iend]);
21         dfs(S, iend+1, tmpres);
22         tmpres.pop_back();
23         //不选择S[iend]
24         dfs(S, iend+1, tmpres);
25     }
26 };
复制代码

算法2:从上面的二叉树可以观察到,当前层的集合 = 上一层的集合 + 上一层的集合加入当前层处理的元素得到的所有集合(其中树根是空集),因此可以从第二层开始(第一层是空集合)迭代地求最后一层的所有集合(即叶子节点),代码如下:

复制代码
 1 class Solution {
 2 public:
 3     vector<vector<int> > subsets(vector<int> &S) {
 4     // IMPORTANT: Please reset any member data you declared, as
 5     // the same Solution instance will be reused for each test case.
 6     int len = S.size();
 7     sort(S.begin(), S.end());
 8     vector<vector<int> > res(1);//开始加入一个空集
 9     for(int i = 0; i < len; ++i)
10     {
11         int resSize = res.size();
12         for(int j = 0; j < resSize; j++)
13         {
14             res.push_back(res[j]);
15             res.back().push_back(S[i]);
16         }
17     }
18     return res;
19 }
20 };
复制代码

 算法3:可以根据二进制的思想,比如对于3个元素的集合,000表示一个元素都不选择,001表示选择第一个元素,101表示选择第一个和第三个元素...。因此如果集合大小为n,我们只需要让一个整数从0逐渐增加到2^n-1, 每个整数的二进制形式可以表示一个集合。如果用整数的二进制表示集合,这个算法有个限制,最大能表示集合元素的个数为64(unsigned long long)。如果使用bitmap,然后模拟二进制的加1操作,则对集合大小就没有限制。刚好这一题集合的大小不超过64

复制代码
 1 class Solution {
 2 public:
 3     vector<vector<int> > subsets(vector<int> &S) {
 4     // IMPORTANT: Please reset any member data you declared, as
 5     // the same Solution instance will be reused for each test case.
 6     int len = S.size();
 7     sort(S.begin(), S.end());
 8     vector<vector<int> > res(1);//开始加入一个空集
 9     
10     unsigned long long bit = 1, bitmax = (1<<len);
11     vector<int> tmpres;
12     while(bit < bitmax)
13     {
14         tmpres.clear();    
15         unsigned long long curBit = bit;
16         for(int i = 0; i < len; i++)//依次检测前len个二进制位
17         {
18             if(curBit & 1)
19                 tmpres.push_back(S[i]);
20             curBit >>= 1;
21         }
22         res.push_back(tmpres);
23         bit++;
24     }
25     return res;
26 }
27 };
复制代码

 


 

LeetCode:Subsets II

Given a collection of integers that might contain duplicates, S, return all possible subsets.

Note:

  • Elements in a subset must be in non-descending order.
  • The solution set must not contain duplicate subsets.

 

For example,
If S = [1,2,2], a solution is:

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

分析:在上一题的基础上,可以允许集合中包含重复元素,我们也把相应的二叉树画出类,以集合{1,2,2}举例

算法1:dfs解法。注意到处理第三个元素2时,因为前面已经处理了一次2,所有第三层中,我们只在已经添加过2的集合{1,2}、{2}上再添加2,而没有在集合{1}, {}上添加2(画叉叉的那么分支),假设下面还有一个2,那么我们只在第四层的包含两个2的集合{1,2,2}、{2,2}上再添加2,其它都不添加。因此dfs时,如果当前处理的数字前面出现了k次,那么我们要处理的集合中必须包含k个该元素。代码如下:

复制代码
 1 class Solution {
 2 private:
 3     vector<vector<int> >res;
 4 public:
 5     vector<vector<int> > subsetsWithDup(vector<int> &S) {
 6         // IMPORTANT: Please reset any member data you declared, as
 7         // the same Solution instance will be reused for each test case.
 8         //先排序,然后dfs每个元素选或者不选,最后叶子节点就是所有解
 9         res.clear();
10         sort(S.begin(), S.end());
11         vector<int>tmpres;
12         dfs(S, 0, tmpres);
13         return res;
14     }
15     void dfs(vector<int> &S, int iend, vector<int> &tmpres)
16     {
17         if(iend == S.size())
18             {res.push_back(tmpres); return;}
19         int firstSame = iend;
20         while(firstSame >=0 && S[firstSame] == S[iend])firstSame--;
21         firstSame++; //firstSame是第一个和S[iend]相同数字的位置
22         int sameNum = iend - firstSame;//和S[iend]相同数字的个数(除自己)
23         if(sameNum == 0 ||
24             (tmpres.size() >= sameNum && tmpres[tmpres.size() - sameNum] == S[iend]))
25         {
26             //选择S[iend]
27             tmpres.push_back(S[iend]);
28             dfs(S, iend+1, tmpres);
29             tmpres.pop_back();
30         }
31         //不选择S[iend]
32         dfs(S, iend+1, tmpres);
33     }
34 };
复制代码

算法2:在上一题算法2的基础上,如果当前处理的元素没有出现过,则把前面得到的所有集合加上该元素;如果出现过,则只把上一轮处理的集合加上该元素。比如处理第二个2时(二叉树第三层),我们只把上一轮添加过数字的集合{1,2}、{2}再添加一个2加入结果中,{1}、{}是从上一层直接继承下来的,所以不作处理。代码如下:

复制代码
 1 class Solution {
 2 private:
 3     vector<vector<int> >res;
 4 public:
 5     vector<vector<int> > subsetsWithDup(vector<int> &S) {
 6         // IMPORTANT: Please reset any member data you declared, as
 7         // the same Solution instance will be reused for each test case.
 8         int len = S.size();
 9         sort(S.begin(), S.end());
10         vector<vector<int> > res(1);//开始加入一个空集
11         int last = S[0], opResNum = 1;//上一个数字、即将要进行操作的子集数量
12         for(int i = 0; i < len; ++i) 
13         {
14             if(S[i] != last)
15             {
16                 last = S[i];
17                 opResNum = res.size();
18             }
19             //如果有重复数字,即将操作的子集的数目和上次相同
20             int resSize = res.size();
21             for(int j = resSize-1; j >= resSize - opResNum; j--)
22             {
23                 res.push_back(res[j]);
24                 res.back().push_back(S[i]);
25             }
26         }
27         return res;
28     }
29 };
复制代码

上一题基于二进制思想的算法3不适合于包含重复元素的集合

【WSN定位】基于AOA算法实现目标无源定位附matlab代码 1 简介 2 部分代码 clear all; close all; clc;​stations = [0 0 0;20 0 0]; %基站位置​X = -100:100; %生成目标位置Y = X.*sin(X);Z = X+Y;N = length(X);Locations = zeros(N,3);angs = zeros(N,4);for i = 1:N angs(i,:) = Angs(stations*1e3,[X(i),Y(i),Z(i)]*1e3);end​for 阅读详情

相关推荐

python 中心线提取_二值分析 | OpenCV + skimage如何提取中心线

点击上方蓝字关注我们微信公众号:OpenCV学堂关注获取更多计算机视觉与深度学习知识问题前几天有个人问了我一个问题,问题是这样的,他有如下的一张二值图像:怎么得到白色Blob中心线,他希望的效果如下:显然OpenCV中常见的轮廓分析无法获得上面的中心红色线段,本质上这个问题是如何提取二值对象的骨架,提取骨架的方法在OpenCV的扩展模块中,另外skimage包也支持图像的骨架提取。这里就...

weixin_42204453的博客 4290

Vscode (Visual Studio Code)使用Thief-Book插件看小说摸鱼神器

Vscode (Visual Studio Code)使用Thief-Book插件看小说摸鱼神器,话不多说直接开整:第一步:打开 VS Code 编辑器,在侧边栏中选择“扩展”,搜索并安装 Thief-Book 插件第二步:准备好要看的小说txt文件,需要另存为选一下utf-8格式,否则待会儿文字会乱码第三步:点击扩展设置,将小说绝对路径填入第四步:按下快捷键 Ctrl+Shift+P,打开命令面板,输入Thief-Book,然后任意选择NextBook开启底部状态栏摸鱼模式

Yongqiang Chen的博客 6万+

wsl2内核版本和模块版本不一致解决方法

** /lib/modules/…build: No such file or directory错误解决办法这篇文章历时1个月整,从4月5日一直到5月5日,这一问题才得以解决。

m0_60634555的博客 5103

VSCode插件开发流程兼【代码注释阅读小说】插件发布

VSCode插件开发流程兼【代码注释阅读小说】插件发布一、前言二、需求三、成果演示四、插件开发流程1、安装环境2、运行生成器3、文件介绍package.json 插件配置extension.js 插件程序入口4、调试5、本地打包和安装6、上线发布五、附【代码注释阅读小说】核心代码六、参考资料 一、前言 很早以前就想写vscode相关的插件,最近有时间于是研究一下。 二、需求 定一个需求:编辑器里面可以用代码注释的形式看小说,达到写代码,看小说两不耽误,老板还会夸你认真工作呢,这是摸鱼的最高境界! 三、成果演

iamlujingtao的博客 1万+

从混乱到清晰:用QJsonObject重构你的Qt网络API数据解析层(避坑指南)

本文详细介绍了如何使用QJsonObject重构Qt网络API数据解析层,避免常见的JSON解析陷阱。通过安全解析模式、数据绑定和性能优化技巧,帮助开发者构建高效、健壮的解析逻辑,提升代码可维护性和可读性。特别适用于处理复杂嵌套的JSON响应数据场景。

weixin_29011667的博客 230

Pytorch学习笔记(III)——提取特征

目录一、引言二、具体步骤1、参数模型2、网络结构3、参数载入4、特征提取器5、读取图片三、完整代码 一、引言   深度学习在许多任务中主要充当着特征学习的作用,而学习完的特征才是后续应用的一个关键。本文将主要介绍,如何提取任意目标层的特征图。   本文以输入数据为图片为例。 二、具体步骤 1、参数模型 博主使用了ResNet50训练了一个人脸识别的网络   训练完成的深度学习模型,我们会保存一...

lockonlxf的博客 2643

上班时间看小说的摸鱼神器来了!

按下快捷键 Ctrl+Shift+P,打开命令面板,输入 Thief-Book,然后任意选择一个即可开启底部状态栏摸鱼模式,如果发现底部没有状态栏,可以看一下状态栏是否勾选,如果没有勾选,勾上即可。总之,Thief-Book 看小说摸鱼神器是一款非常实用的小说阅读插件,可以让你在摸鱼的同时,效率也能变得高效。Thief-Book是国人开发的“摸鱼”神器,可以更加隐秘性的看小说。阅读文件需要.txt 文件,txt文件使用utf-8格式,否则可能乱码,支持快捷键、老板键,可设置自动翻页速度,也可以手动翻页。

SL2456的博客 3万+

SAP SEGW 事物码里的 Association 建模方式

Association 模型用于描述 OData 模型里不同 Entity Type 之间的关联关系。我们来看一个具体的例子:Principal Entity(主体):代表 association 的主导端。Cardinality(基数):指定主体实体类型和依赖实体类型之间的关系。按 F4 或点击从列表中选择。关联的多重性如下:为引用约束()指定以下参数,目的是将主体实体类型的每个键,关联到从属实体类型的一个属性:Referential Constraints 的一个例子如下: 引用约束(Referenti

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 910

状态栏看小说你敢信?!

身为一个合格的摸鱼仔,状态栏看小说你居然都不会?进来学!

skdjbd的博客 1万+

YOLOv8有效涨点,增强型 YOLOV8 与多尺度注意力机制特征融合,附代码,详细步骤

在本实验中,我们通过将双层路由注意(BRA)、广义特征金字塔网络(GFPN)和第四检测头结合到YOLOv8中,开发了一种新颖的BGF-YOLO架构。BGF-YOLO 包含注意力机制,可以更多地关注重要特征,特征金字塔网络可以通过将高级语义特征与空间细节合并来丰富特征表示。此外,我们研究了不同的注意力机制和特征融合、检测头架构对检测准确性的影响。实验结果表明,与YOLOv8x相比,BGF-YOLO的mAP50增加了4.7%。

kay_545 3048

BiSeNet:面向实时语义分割的双边网络

BiSeNet 系列重新定义了实时语义分割的范式“不要在速度和精度之间妥协——用架构创新,两者兼得。V1:提出双边解耦思想,启发后续大量工作;V2:通过极致轻量化,证明小模型也能高精度;V3(工业版):推动端侧 AI 落地,成为行业标准之一。如今,BiSeNet 已成为嵌入式视觉系统的默认选择,其设计理念(解耦、轻量、融合)被广泛应用于目标检测、姿态估计等领域。

浩瀚之水的专栏 268

VSCode 插件

VSCode 插件

时光留不住,毕竟东流去 7560

26. 如何给 SAP BTP Cloud Foundry 环境分配运行时内存

摘要:本文解答了SAP BTP Cloud Foundry环境中Space可用内存为0MB的问题。指出Space内存配额取决于Org配额分配,其计算方式为Org总配额减去所有运行中应用实例的内存预留总和。详细解释了SAP BTP的资源分配层级(Global account→Subaccount→Environment→Org→Space),并说明如何通过Global account的Entity Assignments查看Memory Plan配额分配(以GB为单位)。最后建议遇到问题的用户检查Subacc

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 1265

LeetCode题解:Subsets I and II

Subsets Given a set of distinct integers, S, return all possible subsets. Note: Elements in a subset must be in non-descending order.The solution set must not contain duplicate subset

Magi Su的技术回收站 1550

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

Leetcode OJ: Subsets I/II

Subsets Given a set of distinct integers,S, return all possible subsets. Note: Elements in a subset must be in non-descending order. The solution set must not contain duplicate ...

weixin_30685047的博客 164

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

[leetcode] Subsets Subsets II

Subsets, Subsets II Subsets 问题描述:给定一个不重复的数组A,让计算A中所有数字的排列组合 解决思路:利用DFS来计算所有的组合。 例如A中的数字是1~3 首先我们可以选择{}->{1} -> {1, 2} - >{1, 2, 3} - >{1, 3} - >{2} - > {2, 3} -> {3} 对于第i个数字,我们...

nwpuxhld 595

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

LeetCode 78: Subsets && LeetCode 90: Subsets II

问题描述 Given a set of distinct integers, nums, return all possible subsets (the power set). Note: The solution set must not contain duplicate subsets. Example: Input: nums = [1,2,3] Output: [ [3], [1], ...

zero 620

【LeetCode】解题90:Subsets II

LeetCode解题 90:Subsets II Problem 90: Subsets II [Medium]解题思路Solution (Java)修改过程 Problem 90: Subsets II [Medium] Given a collection of integers that might contain duplicates, nums, return all possible ...

Fayedily的博客 258

LeetCode 90. Subsets II

LeetCode 90. Subsets II (Medium) 主要知识点:回溯、迭代;优先级:5

温迪今天刷题了吗 368

leetcode专题训练 90. Subsets II

这道题是第78题的升级版,78题中所给数组的元素都是不相同的,所以直接回溯搞一发,每个元素都加或不加搞一发即可。然而这道题中元素可能是相同的,所以不能直接每个元素加或不加来搞。比如样例中的[1, 2, 2],只加前面的那个2和只加后面那个2的结果是重复的,所以需要对相同的数进行判断。 在78题中,一个长为l的数组,子集list的第一个元素可以是数组中的每一个元素,第二个元素就是第一个元素的索引之后的数组中的每一个元素,以此类推。解法如下: class Solution: def subsets(se

Ema1997的博客 300

leetcode_subsets-ii

题目链接 https://leetcode-cn.com/problems/subsets-ii/ 题目内容 解题思路 代码 class Solution { public: vector<vector<int>> res; vector<int> now; int n ; vector<vector<int>> subsetsWithDup(vector<int>& nums) {

weixin_38554391的博客 207

【LeetCode with Python】 Subsets II

Given a collection of integers that might contain duplicates, S, return all possible subsets. Note: Elements in a subset must be in non-descending order. The solution set must not contain duplicate subsets. For example, If S = [1,2,2], a solutio

XNERV SURVEYS 3346

Subsets II - LeetCode

目录 题目链接 注意点 解法 小结 题目链接 Subsets II - LeetCode 注意点 有重复的数字 数组可能是无序的,要先排序 解法 解法一:递归,只需要在Subsets中递归写法的基础上多加一句if(find(ret.begin(),ret.end(...

weixin_30439031的博客 113

Leetcode - Subsets I,II

Leetcode - 078. Subsets 这道题重定义了什么叫可行解:一般而言,可行解需要满足强约束性条件集,而本题的可行解就是单一弱约束性条件(distinct integers,只需要当前集合内的元素不重复即可算作一个可行解) ,算是比较简单的入门级dfs + backtracing 题目。 class Solution { p...

weixin_33670786的博客 148

LeetCode - Subsets I && II

https://leetcode.com/problems/subsets/ 这道题比较典型,一般需要all, every之类所有结果的,都可以用递归做,因为题目要求结果要升序,所以在做之前对数组排序,并且在做之前把空集放进去。 注意递归调用helper那行,下一个start不应该是start+1,而是i+1 public List> subsets(int[] S) {

chilakaka的专栏 365

【leetcode】90. Subsets II

leetcode, subsets ||, 3种解法

小do在努力 594
上一篇: 生产者消费者模式 JAVA
下一篇: LeetCode Maximum Subarray Maximum Product Subarray DP问题
Mike_CSU
博客等级 码龄10年 6粉丝 39原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值