Description:
给定一组不含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集)。
说明:解集不能包含重复的子集。
示例:
输入: nums = [1,2,3] 输出: [ [3], [1], [2], [1,2,3], [1,3], [2,3], [1,2], [] ]
先考虑非递归方法,由离散数学的相关知识我们可以知道,一个n元的集合的幂集大小为2的n次方,即C(n,0)+C(n,1)+C(n,2)+...+C(n,n),不过这里如果按照这样的方式递归的话我感觉有一些难度,也不太好构造代码,所以要思考其它的某种规律--我们可以将当前的返回值由之前的返回值中的每一个元素(即一个子集)加上一个元素后得到,例如按照例子中所给的nums:
status1:{} //一开始只有一个空集
status2:{},{1} //加了1之后
status3:{},{1},{2},{1,2} //加了2之后
status4:{},{1},{2},{1,2},{3},{1,3},{2,3},{1,2,3} //加了3之后
一开始没多想,直接模拟的上述方法,简单但果然cpp的runtime垫底(20ms):
class Solution {
public:
vector<vector<int>> subsets(vector<int>& nums) {
vector<vector<int>>res;
res.push_back({});
for (int i = 0;i < nums.size();i++) {
int flag = nums[i];
vector<vector<int>>tmp=res;
for (int i = 0;i < tmp.size();i++) {
tmp[i].push_back(flag);
}
for (int i = 0;i < tmp.size();i++) {
res.push_back(tmp[i]);
}
}
return res;
}
};
后来又看(抄)了看(抄)别人的代码,发现在应该是在迭代中设置容器导致的,新版本:
class Solution {
public:
vector<vector<int>> subsets(vector<int>& nums) {
vector<vector<int>> res(1);
sort(nums.begin(), nums.end());
for (int i = 0; i < nums.size(); ++i) {
int size = res.size();
for (int j = 0; j < size; ++j) {
res.push_back(res[j]);
res.back().push_back(nums[i]);
}
}
return res;
}
};
没有必要pass by value,直接对当前新添加的集合(注意是.back())加入该数即可,runtime缩小为8ms。。。
参考:http://www.cnblogs.com/grandyang/p/4309345.html