【leetcode】 subset I、II

来源:互联网 发布:linux 网银 编辑:程序博客网 时间:2024/05/22 05:13


【subset I】问题:

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

分析:

1、求一组不重复的整数的所有子集;

2、迭代

代码:

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


【subset 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],  []]

分析:

1、现在这组整数允许有重复值;

2、迭代

3、举例[1 2 2]来分析:处理第一个2时子集合为[], [1], [2], [1, 2],而这时再处理第二个2时,如果在[]和[1]后直接加2会产生重复,所以只能在上一个循环生成的后两个子集合后面加2。不重复的条件就是:nums[i]!=nums[i]或者j>pre (其中j从0到res.size(),pre是之前res的大小)

代码:

class Solution {public:    vector<vector<int>> subsetsWithDup(vector<int>& nums) {        sort(nums.begin(),nums.end());        vector<vector<int>> res(1,vector<int>());        int m=nums.size();        int pre=0;        for(int i=0;i<m;i++){            int n=res.size();            for(int j=0;j<n;j++){                if(i==0||nums[i]!=nums[i-1]||j>=pre){                    res.push_back(res[j]);                    res.back().push_back(nums[i]);                }            }            pre=n;         }        return res;    }};



0 0