Leetcode算法学习日志-78 Subsets
来源:互联网 发布:私密空间软件 编辑:程序博客网 时间:2024/06/02 01:22
Leetcode 78 Subsets
题目原文
Given a set of distinct integers,nums, return all possible subsets (the power set).
Note: The solution set must not contain duplicate subsets.
For example,
If nums = [1,2,3]
, a solution is:
[ [3], [1], [2], [1,2,3], [1,3], [2,3], [1,2], []]
题意分析
给一组数,输出其所有无序子数组,空子数组也考虑在内。
解法分析
本题很容易想到写出一棵子集树,用回溯的方法解,只是没有任何剪枝函数,仅仅深度优先遍历这个子集树,C++代码如下:
class Solution {private: vector<int> temp; vector<vector<int>> res; vector<int> nums; int n;public: void DFS(int k){ if(k>n){ res.push_back(temp); return; } DFS(++k); k--; temp.push_back(nums[k-1]); DFS(++k); temp.pop_back(); } vector<vector<int>> subsets(vector<int>& numbers) { nums=numbers; n=nums.size(); DFS(1); return res; }};
注意由于子集树是一个二叉树,因此DFS内部不需要用for循环遍历同层,只需要先后进行两次递归调用DFS,用于选择0和1,对应不取或取相应数字。上述算法和backtracking类似。本题还有一个比较巧妙的方法,同样是通过那棵二叉树找到灵感。用0-2^n-1这几个数作为最终输出中的2^n个vector的序号,对序号所表示数的二进制进行检测,某一位为1代表该vector拥有对应的一个数,依次将数填入res中。C++代码如下:
class Solution {public: vector<vector<int>> subsets(vector<int>& nums) { int n=nums.size(); int m=(int)pow(2.0,n); vector<vector<int>> res(m,vector<int>()); int i,j; for(i=0;i<n;i++){ for(j=0;j<m;j++){ if((j>>i)&1) res[j].push_back(nums[i]); } } return res; }};
阅读全文
0 0
- Leetcode算法学习日志-78 Subsets
- LeetCode算法题目:Subsets AND Subsets II
- [LeetCode 78] Subsets && [LeetCode 90] Subsets II
- LeetCode 78: Subsets
- LeetCode 78 Subsets
- [leetcode 78] Subsets
- Leetcode NO.78 Subsets
- [LeetCode 78]Subsets
- leetcode-78 Subsets
- leetcode || 78、Subsets
- Subsets - LeetCode 78
- leetcode 78 :Subsets
- LeetCode(78) Subsets
- Leetcode #78 Subsets
- leetcode 78: Subsets
- [leetcode-78]subsets(java)
- [Leetcode]#78 Subsets
- LeetCode(78) Subsets
- GUROBI 学术许可(免IP验证)申请流程
- C语言实现hashmap,安卓系统AOSP源码
- State machine
- Java初学者使用 break continue switch 运用实例
- day13 常用类
- Leetcode算法学习日志-78 Subsets
- 1.双目立体视觉算法
- 欢迎使用CSDN-markdown编辑器
- ES6之类语法(Classes)
- 打印 * .
- hadoop2.8.2 MapReduce官方教程
- MyApplication
- 内部类
- SSL2841 2017年11月7日提高组T2 好路线(dp)