78. Subsets
2016-05-14 15:47
337 查看
题目:
Given a set of distinct integers, nums, 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 nums =
is:
题意:
给定一个包含完全不相同元素的set集合nums,返回所有可能的子set集合。
note:
所有子set集合中的元素必须是递增顺序的;
给出的结果set集合不包含重复的子set集合;
思路一:
利用移位操作来分配给定数组元素,给定数组有m个元素,则其子集合的个数为2^m次方个子集合。左移0位并和1相&确定元素1在哪些子集合中,左移1位并和1相&确定元素2在哪些子集合中,左移2位并和1相&确定元素3在哪些子集合中.
代码:8ms
轮询;生成所有子集合的过程如下所示:
1、初始化:[[]]
2、添加第一个元素之后所有的子元素集合为:
(在前面一个集合中添1构成新子集);
3、添加第二个元素之后所有的子元素集合为:
4、添加第三个元素之后所有的子元素集合为:
代码:8ms
Recursive递归(Backtracking回溯)。
代码:8ms
代码:4ms 时间复杂度最低
Given a set of distinct integers, nums, 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 nums =
[1,2,3], a solution
is:
[ [3], [1], [2], [1,2,3], [1,3], [2,3], [1,2], [] ]
题意:
给定一个包含完全不相同元素的set集合nums,返回所有可能的子set集合。
note:
所有子set集合中的元素必须是递增顺序的;
给出的结果set集合不包含重复的子set集合;
思路一:
利用移位操作来分配给定数组元素,给定数组有m个元素,则其子集合的个数为2^m次方个子集合。左移0位并和1相&确定元素1在哪些子集合中,左移1位并和1相&确定元素2在哪些子集合中,左移2位并和1相&确定元素3在哪些子集合中.
代码:8ms
class Solution { public: vector<vector<int>> subsets(vector<int>& nums) { sort(nums.begin(), nums.end()); int m = nums.size(); int subm = pow(2, m); vector<vector<int>> result(subm, vector<int>()); for(int i=0; i<m; i++){ for(int j=0; j<subm; j++){ if((j>>i) & 1){ result[j].push_back(nums[i]); } } } return result; } };思路二:
轮询;生成所有子集合的过程如下所示:
1、初始化:[[]]
2、添加第一个元素之后所有的子元素集合为:
[
[]
,
[1]
];
(在前面一个集合中添1构成新子集);
3、添加第二个元素之后所有的子元素集合为:
[
[], [1]
,
[2], [1, 2]];(在前面两个自己中分别添2构成新子集);
4、添加第三个元素之后所有的子元素集合为:
[
[], [1], [2], [1, 2]
,
[3], [1, 3], [2, 3], [1, 2, 3]]
。(在前面四个子集中分别添加3构成新的子集)
代码:8ms
class Solution { public: vector<vector<int>> subsets(vector<int>& nums) { sort(nums.begin(), nums.end()); vector<vector<int>> result(1, vector<int>()); for(int i=0; i<nums.size(); i++){ int n = result.size(); for(int j=0; j<n; j++){ result.push_back(result[j]); result.back().push_back(nums[i]); } } return result; } };思路三:
Recursive递归(Backtracking回溯)。
代码:8ms
class Solution { public: vector<vector<int>> subsets(vector<int>& nums) { sort(nums.begin(), nums.end()); vector<vector<int>> results; vector<int> result; genSubsets(nums, 0, result, results); return results; } void genSubsets(vector<int>& nums, int start, vector<int>& result, vector<vector<int>>& results){ results.push_back(result); for(int i=start; i<nums.size(); i++){ result.push_back(nums[i]); genSubsets(nums, i+1, result, results); result.pop_back(); } } };
代码:4ms 时间复杂度最低
class Solution { public: vector<vector<int>> subsets(vector<int>& nums) { sort(nums.begin(), nums.end()); vector<vector<int>> results; vector<int> result; genSubsets(nums, 0, result, results); return results; } void genSubsets(vector<int>& nums, int i, vector<int>& result, vector<vector<int>>& results){ if(i==nums.size()){ results.push_back(result); return; } result.push_back(nums[i]); genSubsets(nums, i+1, result, results); result.pop_back(); genSubsets(nums, i+1, result, results); return; } };
相关文章推荐
- fork, vfork 和 clone
- ZCTF2015 pwn试题分析
- 线程
- 收集android上开源的酷炫的交互动画和视觉效果:Interactive-animation
- 2.结构型.2.适配器模式
- Summary Ranges
- zoj1171题解
- I/O
- 2.结构型.1.组合模式
- Android 自定义SnakeBar
- ConcurrentHashMap之源码分析
- 第10、11周项目(3)-警察与厨师
- IT屌丝必修课-如何利用所会的IT思想轻松将美女抱回家!
- IT屌丝必修课-如何利用所会的IT思想轻松将美女抱回家!
- dblink的查询与删除
- 命令模式在MVC框架中的应用
- 查询sequence
- BZOJ 3091: 城市旅行
- C primer plus 学习之存储类、链接、内存管理
- 小波函数的数据拟合方法