Subsets

来源:互联网 发布:环保行业 知乎 编辑:程序博客网 时间:2024/06/06 03:30

Subsets

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],  []]
解析:三种方法都是听经典的方法,递归,迭代,二进制,这道题应该很快写出来的,sad...,对于n个数有2的n次方个结果,n+1的话就把原来的数再加上新的数,之前的保持不变,变成了原来的二倍。

代码:

class Solution {public:    vector<vector<int>> subsets(vector<int>& nums) {        vector<vector<int>>ans;        vector<int>path;        subset(ans,nums,0,path);        return ans;    }            void subset(vector<vector<int>>&ans,vector<int>nums,int begin,vector<int>&path)    {                ans.push_back(path);        for (int i=begin; i<nums.size(); i++)        {            path.push_back(nums[i]);            subset(ans,nums,i+1,path);            path.pop_back();        }        return ;            }};

class Solution {public:    vector<vector<int>> subsets(vector<int>& nums) {        vector<vector<int>>ans;        vector<int>path;        ans.push_back(path);        for (int i=0; i<nums.size(); i++)        {            int cnt=ans.size();            for (int j=0; j<cnt; j++)            {                path=ans[j];                path.push_back(nums[i]);                ans.push_back(path);            }        }        return ans;    }    };

Subsets II

Given a collection of integers that might contain duplicates, nums, return all possible subsets.

Note: The solution set must not contain duplicate subsets.

For example,
If nums = [1,2,2], a solution is:

[  [2],  [1],  [1,2,2],  [2,2],  [1,2],  []]
解析:

由于数组中可能存在重复元素,首先把数组进行排序,在求子数组时,如果当前元素与前一个元素相同则跳过当前元素。


代码:

class Solution {public:    vector<vector<int>> subsetsWithDup(vector<int>& nums) {                vector<vector<int>>ans;        vector<int>path;        int begin=0;        sort(nums.begin(),nums.end());        dfs(nums,ans,path,begin);        return ans;    }    void dfs(vector<int>&nums,vector<vector<int>>&ans,vector<int>&path,int begin)    {        ans.push_back(path);        int temp=0;        for (int i=begin; i<nums.size(); i++)        {            if ((i!=begin)&&nums[i]==temp)            continue;            path.push_back(nums[i]);            dfs(nums,ans,path,i+1);            temp=path.back();            path.pop_back();        }        return ;    }            };




1 0