46. Permutations

来源:互联网 发布:制作合格证的软件 编辑:程序博客网 时间:2024/06/07 22:21

这里写图片描述
第一种方法类似31题的Next Permutation,只不过是把所有情况都输出来

class Solution {public:    vector<vector<int> > permute(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;    }};

第二种方法,使用C++自带的next_permutation函数

class Solution {public:    vector<vector<int> > permute(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> > permute(vector<int>& nums) {        vector<vector<int> > ret;        vector<int> tmp;        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;        for(i=0;i<nums.size();i++)        {            if(find(temp.begin(),temp.end(),nums[i])==temp.end())            {                temp.push_back(nums[i]);                DFS(nums,temp,result,count+1);                temp.pop_back();            }        }    }};

第四种方法:也是回溯

class Solution {public:  vector<vector<int> > permute(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 ++)      {        swap(nums[index], nums[i]);        backtack(ret, nums, index + 1);        swap(nums[index], nums[i]);      }    }  }};
0 0