Leetcode 78. Subsets

来源:互联网 发布:tomcat修改端口号 编辑:程序博客网 时间:2024/06/05 05:50

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+recursiveclass 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+recursiveclass 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;    }};
0 0