您的位置:首页 > 其它

Subsets -- LeetCode

2016-01-27 12:48 363 查看
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],
[]
]

思路:由于nums中每个数字都没有重复,因此该数字只有出现或不出现两种情况。

这道题有三种方法来做。第一种是用dfs来遍历每一种情况。

class Solution {
public:
void help(vector<vector<int> >& res, vector<int>& nums, vector<int> cand, int cur)
{
if (cur == nums.size())
{
res.push_back(cand);
return;
}
help(res, nums, cand, cur + 1);
cand.push_back(nums[cur]);
help(res, nums, cand, cur + 1);
}
vector<vector<int>> subsets(vector<int>& nums) {
sort(nums.begin(), nums.end());
vector<vector<int> > res;
vector<int> cand;
help(res, nums, cand, 0);
return res;
}
};


第二种方法,用位运算。每一位表示nums数组中的一个数字是否出现。

class Solution {
public:
vector<vector<int>> subsets(vector<int>& nums) {
int tot = 1 << nums.size();
vector<vector<int> > res;
sort(nums.begin(), nums.end());
for (int i = 0; i < tot; i++)
{
vector<int> tem;
for (int j = 0; (1 << j) <= i; j++)
if ((1 << j) & i)
tem.push_back(nums[j]);
res.push_back(tem);
}
return res;
}
};


第三种是迭代。依次枚举每一个位置的数字,将其加到当前已有的所有子集的最后作为新的子集。

class Solution {
public:
vector<vector<int>> subsets(vector<int>& nums) {
sort(nums.begin(), nums.end());
vector<vector<int>> subs(1, vector<int>());
for (int i = 0; i < nums.size(); i++) {
int n = subs.size();
for (int j = 0; j < n; j++) {
subs.push_back(subs[j]);
subs.back().push_back(nums[i]);
}
}
return subs;
}
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: