leetcode-78-子集(用bfs解决)
题目描述:
给定一组不含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集)。
说明:解集不能包含重复的子集。
示例:
输入: nums = [1,2,3]
输出:
[
[3],
[1],
[2],
[1,2,3],
[1,3],
[2,3],
[1,2],
[]
]
要完成的函数:
vector<vector<int>> subsets(vector<int>& nums)
说明:
1、这道题给定一组不重复的元素,要求返回这组元素所有可能的子集,也就是返回幂集。
每个可能的子集存储在一维vector中,所有的子集合起来存储在二维的vector中。
2、举个例子,给定的vector是[1,2,3,4]。
那我们人类在做这道题的时候,都是想:
0个元素的:[]
1个元素的:1 2 3 4
2个元素的:12 13 14 23 24 34
3个元素的:123 124 234
4个元素的:1234
2个元素的子集,是在1个元素的子集的基础上形成的。
比如1可以扩散出12 13 14,2可以扩散出23 24……
这像是树开枝散叶,往外扩散的样子?
我们这样子看:

我们其实最后要的是宽度优先搜索这棵树的结果。
所以这道题其实是一道BFS(宽度优先搜索)的题目,用熟悉的队列就可以解决。
代码如下:(附详解)
void bfs(vector<vector<int>>& res,queue<vector<int>>& q,int s1,vector<int>& nums)
{//这里要带上&,指针,传参数快,而且在存储空间中修改了res的值,最后也能在subsets函数中得到
int i,count=1;
while(!q.empty())//当存储中间过程的数据不空
{
for(int j:q.front())//把第一个vector中的坐标数据读出来,插入到res[count]中,最开始是[0]
res[count].push_back(nums[j]);
count++;
i=q.front().back();//得到最后一个坐标,i=0
while(i+1<s1)
{
q.push(q.front());在q的末尾插入[0]
q.back().push_back(i+1);//在q的最后一个vector,也就是刚刚插入的[0],再插入1,形成[0,1]
i++;//i++,不断循环
}
q.pop();//去掉第一个vector,最开始时是[0]
}
}
vector<vector<int>> subsets(vector<int>& nums)
{
int s1=nums.size();
vector<vector<int>>res(pow(2,s1),vector<int>{});//提前申请好2^s1个vector<int>空间
queue<vector<int>>q;//我们用队列来存储中间过程的数据
for(int i=0;i<s1;i++)//如果给定nums是[1,2,3],那么这里存储它们的坐标[0],[1],[2]
q.push({i});
bfs(res,q,s1,nums);//带着res的指针和q的指针以及nums这些数据,进入bfs函数
return res;//返回最终的res
}
上述代码其实就是bfs的实现过程,只不过我们没有真的去建树,直接把数据插入到队列中。
上述代码实测4ms,beats 100.00% of cpp submissions。
leetcode-78-子集(用bfs解决)的更多相关文章
- LeetCode 78. 子集(Subsets) 34
78. 子集 78. Subsets 题目描述 给定一组不含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集). 说明: 解集不能包含重复的子集. 每日一算法2019/6/6Day 34L ...
- 每日一题-——LeetCode(78)子集
给定一组不含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集).输入: nums = [1,2,3]输出:[ [3], [1], [2], [1,2,3], [1,3], [2, ...
- Java实现 LeetCode 78 子集
78. 子集 给定一组不含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集). 说明:解集不能包含重复的子集. 示例: 输入: nums = [1,2,3] 输出: [ [3], [1], ...
- [LeetCode]78. 子集(位运算;回溯法待做)
题目 给定一组不含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集). 说明:解集不能包含重复的子集. 示例: 输入: nums = [1,2,3] 输出: [ [3], [1], ...
- LeetCode 78 - 子集
给定一组不含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集). 说明:解集不能包含重复的子集. 示例: 输入: nums = [1,2,3]输出:[ [3], [1], [2], [1, ...
- leetcode 78. 子集 JAVA
题目: 给定一组不含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集). 说明:解集不能包含重复的子集. 示例: 输入: nums = [1,2,3] 输出: [ [3], [1], ...
- [LeetCode] 78. 子集 ☆☆☆(回溯)
描述 给定一组不含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集). 说明:解集不能包含重复的子集. 示例: 输入: nums = [1,2,3]输出:[ [3], [1], [2] ...
- leetcode 78. 子集(c++)
给定一组不含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集). 说明:解集不能包含重复的子集. 示例: 输入: nums = [1,2,3]输出:[ [3], [1], [2], ...
- leetcode 78子集
采用回溯法:对于例子图解执行过程如下,其中向上的分支为向下递归,向下的分支为第二次递归,因此已经push了对应的下标的值,则从根到右边连起来的路径即为组合 由于整个过程类似于二叉树的中序遍历,因此代码 ...
- LeetCode 78. 子集 C++(位运算和回溯法)
位运算 class Solution { public: vector<vector<int>> subsets(vector<int>& nums) { ...
随机推荐
- des,原理待续
网络上转载的代码,忘记出处了请原作者见谅! des类 import java.security.*; import javax.crypto.*; /** * DES加解密算法 */ public c ...
- centos7 ntp服务器配置
一.ntp服务是什么 1. 定义 NTP是网络时间协议(Network Time Protocol),它是用来同步网络中各个计算机的时间的协议. 2. 发展 首次记载在Internet Enginee ...
- docker daemon文件/etc/docker/daemon.json配置
On Linux The default location of the configuration file on Linux is /etc/docker/daemon.json. The --c ...
- Atom 编辑器侧边栏忽略隐藏文件
设置中配置需要忽略的文件后缀 package中找到treeview,勾选上这个配置就行
- js Object
对象 var ob = {}; 键值对 可以做为key的有 :数字,boolean(某些浏览器不支持,比如IE),字符串(不包含标识符) 可以作为value的有 :一切可以解析为具体值的代码 var ...
- (4)-optXXX方法的使用
在JSONObject获取value有多种方法,如果key不存在的话,这些方法无一例外的都会抛出异常.如果在线环境抛出异常,就会使出现error页面,影响用户体验,针对这种情况最好是使用optXXX方 ...
- delphi Overload 和override的区别
overload是重载;相同的函数名,参数不同,使用不同的函数体 override 是对父类声明的vitural或dynamic方法进行覆盖 overload的使用方法: [delphi] v ...
- test4 结对项目
[必做 1] 基于作业3的结果,读取一个较小的文本文件A_Tale_of_Two_Cities.txt,统计该文件中的单词的频率,并将统计结果输出到当前目录下的 Result1.txt 文件. 结对对 ...
- 如何为SharePoint文档库、文件夹、文件单独设置权限
在这里使用截图的方式简单描述两个问题:设置SharePoint Server文档库权限和文档库中的文件夹权限 一.设置SharePoint Server文档库权限 Figure 1 - 打开文档库后, ...
- SSH案例--入门级
1.项目功能展示 (1)注册 (2)修改地址与级别信息,点击修改 (3)再添加一位成员,进行删除 点击第二行的删除 (4)登录模块测试 输入数据库中没有的信息: 输入数据库中存在的信息: 2. W ...