47. Permutations II(unsolved)

来源:互联网 发布:nginx 如何装tomcat 编辑:程序博客网 时间:2024/05/22 07:52

Given a collection of numbers that might contain duplicates, return all possible unique permutations.

For example,
[1,1,2] have the following unique permutations:
[
[1,1,2],
[1,2,1],
[2,1,1]
]

class Solution {public:    vector<vector<int>> permuteUnique(vector<int> nums) {        vector<vector<int>> result;        vector<int> res;        sort(nums.begin(),nums.end());        perm(nums,result,0,nums.size());        return result;    }    void perm(vector<int> nums, vector<vector<int>>& result,int stage,int target)    {        if(stage==target-1)        {            result.push_back(nums);            return ;        }        for(int i=stage;i<target;i++)        {            swap(nums[i],nums[stage]);            if(nums[i]!=nums[stage]||i==stage)                perm(nums,result,stage+1,target);        }    }};

二刷时,想用类似permutation1 的做法,所以就这样做,注意用set可以保证不会重复,所以是个简单的方法。

class Solution {public:    set<vector<int>> result;    vector<vector<int>> permuteUnique(vector<int>& nums) {        if(nums.empty()) return vector<vector<int>>(result.begin(),result.end());        //sort(nums.begin(),nums.end());//用set不用会重复的问题,所以不用sort了        solve(nums,0,nums.size());        return vector<vector<int>>(result.begin(),result.end());    }    void solve(vector<int> nums,int begin,int end)    {        if(begin>=end)        {            result.insert(nums);        }        for(int i=begin;i<end;i++)        {            if(i!=begin&&nums[i]==nums[begin])//这句话其实只是省时间,不用他一样可以ac,因为用了set                continue;            swap(nums[begin],nums[i]);            solve(nums,begin+1,end);            swap(nums[begin],nums[i]);        }    }};

下面是permutation1 的做法,所解决的问题是没有重复的数字的。可以看到非常相似。

class Solution {public:    vector<vector<int>> result;    vector<vector<int>> permute(vector<int>& nums) {        if(nums.empty()) return result;        solve(nums,0,nums.size());        return result;    }    void solve(vector<int> nums,int begin,int end){        if(begin==end)        {            result.push_back(nums);            return ;        }        for(int i=begin;i<end;i++)        {            swap(nums[begin],nums[i]);            solve(nums,begin+1,end);            swap(nums[begin],nums[i]);        }    }};
0 0
原创粉丝点击