题目描述:

给定一组不含重复元素的整数数组 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解决)的更多相关文章

  1. LeetCode 78. 子集(Subsets) 34

    78. 子集 78. Subsets 题目描述 给定一组不含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集). 说明: 解集不能包含重复的子集. 每日一算法2019/6/6Day 34L ...

  2. 每日一题-——LeetCode(78)子集

    给定一组不含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集).输入: nums = [1,2,3]输出:[ [3],  [1],  [2],  [1,2,3],  [1,3],  [2, ...

  3. Java实现 LeetCode 78 子集

    78. 子集 给定一组不含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集). 说明:解集不能包含重复的子集. 示例: 输入: nums = [1,2,3] 输出: [ [3], [1], ...

  4. [LeetCode]78. 子集(位运算;回溯法待做)

    题目 给定一组不含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集). 说明:解集不能包含重复的子集. 示例: 输入: nums = [1,2,3] 输出: [ [3],   [1],   ...

  5. LeetCode 78 - 子集

    给定一组不含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集). 说明:解集不能包含重复的子集. 示例: 输入: nums = [1,2,3]输出:[ [3], [1], [2], [1, ...

  6. leetcode 78. 子集 JAVA

    题目: 给定一组不含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集). 说明:解集不能包含重复的子集. 示例: 输入: nums = [1,2,3] 输出: [ [3],   [1], ...

  7. [LeetCode] 78. 子集 ☆☆☆(回溯)

    描述 给定一组不含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集). 说明:解集不能包含重复的子集. 示例: 输入: nums = [1,2,3]输出:[ [3],  [1],  [2] ...

  8. leetcode 78. 子集(c++)

    给定一组不含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集). 说明:解集不能包含重复的子集. 示例: 输入: nums = [1,2,3]输出:[ [3],  [1],  [2],  ...

  9. leetcode 78子集

    采用回溯法:对于例子图解执行过程如下,其中向上的分支为向下递归,向下的分支为第二次递归,因此已经push了对应的下标的值,则从根到右边连起来的路径即为组合 由于整个过程类似于二叉树的中序遍历,因此代码 ...

  10. LeetCode 78. 子集 C++(位运算和回溯法)

    位运算 class Solution { public: vector<vector<int>> subsets(vector<int>& nums) { ...

随机推荐

  1. ajax406错误

    如上,ajax请求时一直返回error,但是后台已经正确返回.网上给出的解决办法是spring3.*的,但我的是sppring 4.*的,应该不适用,我也没试. 思索一下,406 not accept ...

  2. SqlMapConfig.xml配置文件中的properties属性

    1.原始的SqlMapConfig.xml配置文件的内容为: <?xml version="1.0" encoding="UTF-8" ?> < ...

  3. 利率计算v5.0--结对--软件工程

    利率计算v5.--测试--软件工程 1.任务结对同伴: 名字:王昕明 学号: 博客地址 :http://home.cnblogs.com/u/xinmingwang/ Git : https://gi ...

  4. MYISM表并发写请求过多 导致无法被读取解决方案

    MyISAM锁调度是如何实现的呢,这也是一个很关键的问题.例如,当一个进程请求某个MyISAM表的读锁,同时另一个进程也请求同一表的写锁,此时MySQL将会如优先处理进程呢?通过研究表明,写进程将先获 ...

  5. cnblog博客管理

    http://www.cnblogs.com/wc1903036673/                                        12436109 https://www.cnb ...

  6. PL/SQL Developer 窥探事务

    一次登录代表一个连接 一个SQL Window 代表一个会话(session),有唯一的SID 事务(transaction) 由 insert .update 或者 delete 开启 由 comm ...

  7. UIPickerView 修改必须滚动才修改值的bug

    //相应的选择转动 - (void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSI ...

  8. python + selenium + Js 处理轮动条

    selenium并不是万能的,有时候页面上操作无法实现的,这时候就需要借助JS来完成了. 常见场景: 当页面上的元素超过一屏后,想操作屏幕下方的元素,是不能直接定位到,会报元素不可见的. 这时候需要借 ...

  9. 读<走出软件作坊>有感

    1.成功的人都是在不可能完成任务的情况下完成的,成功的人也从来不会抱怨客观条件多么糟糕. 2.公司给你的资源,永远小于你做事需要的资源,这就是现实,就这么多人,就这样的素质,必须在现状中想出做事的办法 ...

  10. Android-应用安装/替换/卸载/广播监听

    在上一篇博客Android-开关机的广播,中介绍了,如何订阅接收者,去接收系统发送的开机/关机广播, 而这篇博客是订阅接收者 去接收应用的(安装/替换/卸载) 三种广播 订阅 接收者 去接收 应用的 ...