47. Permutations II

来源:互联网 发布:淘宝电动车加热手套 编辑:程序博客网 时间:2024/06/05 01:53

这里写图片描述
类似46题,但是要对回溯进行减枝
46的前两种非递归法同样可以用在这里
第一种方法

class Solution {public:    vector<vector<int> >  permuteUnique(vector<int>& nums)     {        sort(nums.begin(),nums.end());        vector<vector<int> >result;        result.push_back(nums);        int i,j;        while(1)        {            for(i=nums.size()-1;i>0;i--)            {                if(nums[i]>nums[i-1])                    break;            }            if(i==0)                break;            for(j=nums.size()-1;j>=i;j--)            {                if(nums[j]>nums[i-1])                {                    swap(nums[j],nums[i-1]);                    break;                }            }            reverse(nums.begin()+i,nums.end());            result.push_back(nums);        }        return result;    }};

第二种方法:

class Solution {public:    vector<vector<int> >  permuteUnique(vector<int>& nums) {        vector<vector<int> > ret;        if (nums.empty())            return ret;        sort(nums.begin(), nums.end());        ret.push_back(nums);        while (next_permutation(nums.begin(), nums.end()))            ret.push_back(nums);        return ret;    }};

两种回溯法

class Solution {public:    vector<vector<int> >  permuteUnique(vector<int>& nums)     {        vector<vector<int> > ret;        vector<int> tmp;        sort(nums.begin(),nums.end());        DFS(nums,tmp,ret,0);        return ret;    }    void DFS(vector<int>& nums,vector<int>& temp,vector<vector<int> >&result,int count)     {        if(count==nums.size())            result.push_back(temp);        int i,j;        for(i=0;i<nums.size();i++)            if(!i||nums[i]!=nums[i-1])            {                int c1=0,c2=0;                 for(j=0;j<count;j++)                    if(nums[i]==temp[j]) c1++;                for(j=0;j<nums.size();j++)                    if(nums[i]==nums[j]) c2++;                if(c1<c2)                {                    temp.push_back(nums[i]);                    DFS(nums,temp,result,count+1);                    temp.pop_back();                }            }    }};
class Solution {public:  vector<vector<int> >  permuteUnique(vector<int>& nums) {    vector<vector<int> > ret;    backtack(ret, nums, 0);    return ret;  }  void backtack(vector<vector<int> > &ret, vector<int> &nums, int index)  {    if (index == nums.size())    {      ret.push_back(nums);    }    else    {      for (int i = index; i < nums.size(); i ++)      {            sort(nums.begin()+index,nums.end());            if(i!=index&&nums[i]==nums[i-1])                    continue;            swap(nums[index], nums[i]);            backtack(ret, nums, index + 1);            swap(nums[index], nums[i]);      }    }  }};
0 0
原创粉丝点击