【leetcode】subsets
来源:互联网 发布:高中网络课程 编辑:程序博客网 时间:2024/05/19 02:03
题目:
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.位操作
数组的子集中的数字只有两种状态 1. 存在 2. 不存在 分别用1/0来表示这两种状态,则每个子集都可以用n位的0/1的二进制数来表示
因此对于每个子集 只需要查看该子集的标号(0/1序列)各位中是否含有1,有1 表示该位的数字存在,否则 不存在,基于这个原理 可得下列的代码:
vector<vector<int> > subsets(vector<int> &S) { //首先对原数组进行排序 sort (S.begin(), S.end()); //数组的大小 即每个子集的二进制序列的长度 int elem_num = S.size(); //子集的数目 int subset_num = pow (2, elem_num); vector<vector<int> > subset_set (subset_num, vector<int>()); for (int i = 0; i < elem_num; i++) for (int j = 0; j < subset_num; j++) //判断每个子集的二进制序列的i位是否为1 为1 则存在该数(加入到子集数组中) if ((j >> i) & 1) subset_set[j].push_back (S[i]); return subset_set; }
2.
如{1,2,3}的子集 包括0个数的组合,1个数的组合,2个数的组合和3个数的组合合并而成:
vector<vector<int>> subsets(vector<int>& nums) { res.push_back(tmp); int n=nums.size(); if(!n) return res; sort(nums.begin(),nums.end()); for(int i=1;i<=n;i++){ helper(nums,i,0,n-1,0); } return res;}void helper(vector<int>& nums,int k,int start,int n,int num){ if(num==k){ res.push_back(tmp); return; } for(int i=start;i<=n;i++){ tmp.push_back(nums[i]); helper(nums,k,i+1,n,num+1); tmp.pop_back(); }}
3. dfs(向后追溯)
vector<vector<int>> subsets(vector<int>& nums) { sort(nums.begin(), nums.end()); vector<vector<int>> subs; vector<int> sub; genSubsets(nums, 0, sub, subs); return subs; }void genSubsets(vector<int>& nums, int start, vector<int>& sub, vector<vector<int>>& subs) { subs.push_back(sub); for (int i = start; i < nums.size(); i++) { //原数组的子集可由 某个数+{去掉该数的集合的子集} 得到 sub.push_back(nums[i]); genSubsets(nums, i + 1, sub, subs); sub.pop_back(); }}
0 0
- 【LeetCode】 Subsets Subsets II
- 【LeetCode】Subsets & Subsets II
- LeetCode Subsets && Subsets II
- LeetCode Subsets && Subsets II
- LeetCode-Subsets & Subsets II
- LeetCode: Subsets
- LeetCode Subsets
- [Leetcode] Subsets
- LeetCode : Subsets
- [LeetCode] Subsets
- Leetcode: Subsets
- Leetcode: Subsets ||
- [leetcode] subsets
- Leetcode - Subsets
- [LeetCode]Subsets
- LeetCode-Subsets
- LeetCode - Subsets
- LeetCode | Subsets
- 经典算法之-----贪心算法
- UI优化技巧:使用layoutopt进行布局优化
- java中使用sort()对ArrayList进行排序
- eclipse配置maven
- switch用法(这个感觉很容易理解)
- 【leetcode】subsets
- 第2周项目3(1)——两种排序算法的运行时间
- C++中的 cout 和cin
- 数据结构—Java版链表相交问题的终极解决方案
- 黑马程序员--------Java基础-----数组和类
- hdu Travel
- cmd命令大全
- Git学习之基础<1>
- 刚开始学习测试的小感触