您的位置:首页 > 其它

Leetcode 78. Subsets

2017-01-31 14:41 465 查看
Given a set of distinct integers, nums, return all possible subsets.

Note: 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],
[]
]


s思路:

1. 方法1:双重for+recursive的backtracking.在主程序里,长度从0-n可变为for循环,在helper()中,每个位置的数可变为for循环,从左侧位置深入到右侧位置为recursive实现。思路简单清晰

2. 方法2:用双重for还是比较冗长,发现自己第一次刷的时候直接一个for就解决了。因为不控制长度,每次直接把cur放在结果中,而不用判断长度是否满足条件,代码更妙!

//方法1:双重for+recursive
class Solution {
public:

void helper(vector<int>& nums,vector<vector<int>>&res,vector<int>& cur,int len,int idx){
if(len==0){
res.push_back(cur);
return;
}

for(int i=idx;i<nums.size();i++){
cur.push_back(nums[i]);
helper(nums,res,cur,len-1,i+1);
cur.pop_back();
}
}

vector<vector<int>> subsets(vector<int>& nums) {
//
vector<vector<int>> res;
int n=nums.size();
for(int len=0;len<=n;len++){
vector<int> cur;
helper(nums,res,cur,len,0);
}
return res;
}
};

//方法2:单个for+recursive
class Solution {
public:

void helper(vector<int>& nums,vector<vector<int>>&res,vector<int>& cur,int idx){
res.push_back(cur);

for(int i=idx;i<nums.size();i++){
cur.push_back(nums[i]);
helper(nums,res,cur,i+1);
cur.pop_back();
}
}

vector<vector<int>> subsets(vector<int>& nums) {
//
vector<vector<int>> res;
int n=nums.size();
vector<int> cur;
helper(nums,res,cur,0);
return res;
}
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  leetcode backtracki