前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >所有子集 剑指 Offer II 079

所有子集 剑指 Offer II 079

作者头像
叶茂林
发布2023-07-30 11:01:15
1320
发布2023-07-30 11:01:15
举报
文章被收录于专栏:叶子的开发者社区

我只是喜欢敲代码@_@

题目描述

给定一个整数数组 nums ,数组中的元素 互不相同 。返回该数组所有可能的子集(幂集)。

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

示例 1:

输入:nums = [1,2,3] 输出:[[],[1],[2],[1,2],[3],[1,3],[2,3],[1,2,3]] 示例 2:

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

提示:

1 <= nums.length <= 10 -10 <= nums[i] <= 10 nums 中的所有元素 互不相同

AC代码

代码语言:javascript
复制
class Solution {
public:
    vector<vector<int>> subsets(vector<int>& nums) {
    	set<vector<int>>sons;
    	for(auto & num:nums){
    		set<vector<int>>temp;
			for(auto it:sons){
				it.push_back(num);
				temp.insert(it);
			}
			sons.insert(temp.begin(),temp.end());
			sons.insert({num}); 		
		}
		vector<vector<int>>answer;
		answer.push_back({});
		for(auto & it:sons)
		answer.push_back(it);
		return answer;
    }
};

思路分析

先说一下解法哈,子集问题有很多种解决方法,我写的这个只有两层循环,回溯递归之类的也能写,这是C++写的代码,有大佬可以用四行python解决,同样的解决思路。

对于一串数字,我们想要找出它的所有子集,像1,2,3这个,我们第一次取出1,它自己本身是一个子集,我们把它存起来,第二次取出2,把2插入之前找到的子集中,就有了1,2这个子集,再把它自己存进去,第三次取出3,把3插入之前找到的子集,这样就会有1,3和2,3和1,2,3这些子集,再把3自己存进去。

基本思路是这样,实际操作的时候,会出现重复的子集,所以我们需要先用set来去重,嘻嘻嘻,你会不会有一个疑惑,为什么不一开始就用set,非要我们返回一个vector的呢,我起初也有这样的疑惑,直到我发现set不会存在{}这个空集,而vector可以装一个{}的时候就豁然开朗了。

还有一个问题,我依照这样的思路写的第一次代码其实长这样:

代码语言:javascript
复制
    	for(auto num:nums){
			for(auto it:sons){
				it.push_back(num);
				sons.insert(it);
			}
			sons.insert({num}); 		
		}

没有引入一个临时变量temp,直到运行超时,手动调试发现这个地方无限循环,原因在于sons每次都加一个元素,然后就不会终结循环,所以得引入一个变量。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-08-16,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 题目描述
  • AC代码
  • 思路分析
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档