您的位置:首页 > 其它

[算法分析与设计] leetcode 每周一题: 078. Subsets

2017-11-02 18:30 651 查看
题目链接: 

078. Subsets

题目大意:

给定一个由各不相同的整数组成的集合 nums, 返回其所有的子集 (即 其 power set) ;

例如: 给定: nums =[1,
2, 3], 则输出可以是: 

[
[3],
[1],
[2],
[1,2,3],
[1,3],
[2,3],
[1,2],
[]
]


( 注: 题意应该是指顺序可以不同 )

解题过程:

(1) (这一题应该是很老的题了 ...) 考虑 powerset 的定义可知, 设有集合 S, 以及减去其一个元素e
后的子集 S', 则有: powerset(S) = powerset(S') ⋃ appended(powerset(S'), e), 其中
appended(S, e) 表示 集合之集合 S 中每个元素(集合)都加上元素 e 后形成的新集合 ;

(2) 而且本题也没有内存之类的限制, 所以可以按 (1) 中思路实现 ;

代码如下:

class Solution {
public:
using Set = vector<int>;
using SetOfSet = vector<vector<int>>;

SetOfSet powerset(Set nums) {
if (nums.size() == 0) {
return SetOfSet{ Set{} };
}

auto e = nums.back();
nums.pop_back();
auto ret = powerset(nums);
for (size_t i = 0, oldSize = ret.size(); i < oldSize; i++) {
auto s = ret[i];
s.push_back(e);
ret.push_back(s);
}

return ret;
}
vector<vector<int>> subsets(vector<int>& nums) {
auto s = nums;
return powerset(s);
}
};


Runtime: 6 ms

题目链接: 

078. Subsets

题目大意:

给定一个由各不相同的整数组成的集合 nums, 返回其所有的子集 (即 其 power set) ;

例如: 给定: nums =[1,
2, 3], 则输出可以是: 

[
[3],
[1],
[2],
[1,2,3],
[1,3],
[2,3],
[1,2],
[]
]


( 注: 题意应该是指顺序可以不同 )

解题过程:

(1) (这一题应该是很老的题了 ...) 考虑 powerset 的定义可知, 设有集合 S, 以及减去其一个元素e
后的子集 S', 则有: powerset(S) = powerset(S') ⋃ appended(powerset(S'), e), 其中
appended(S, e) 表示 集合之集合 S 中每个元素(集合)都加上元素 e 后形成的新集合 ;

(2) 而且本题也没有内存之类的限制, 所以可以按 (1) 中思路实现 ;

代码如下:

class Solution {
public:
using Set = vector<int>;
using SetOfSet = vector<vector<int>>;

SetOfSet powerset(Set nums) {
if (nums.size() == 0) {
return SetOfSet{ Set{} };
}

auto e = nums.back();
nums.pop_back();
auto ret = powerset(nums);
for (size_t i = 0, oldSize = ret.size(); i < oldSize; i++) {
auto s = ret[i];
s.push_back(e);
ret.push_back(s);
}

return ret;
}
vector<vector<int>> subsets(vector<int>& nums) {
auto s = nums;
return powerset(s);
}
};


Runtime: 6 ms
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: