题目链接:
题目大意:
给定一个由各不相同的整数组成的集合 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
题目链接:
题目大意:
给定一个由各不相同的整数组成的集合 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