全排列Permutation

Permutations
Given a collection of numbers, return all possible permutations.

For example,
[1,2,3] have the following permutations:
[1,2,3], [1,3,2], [2,1,3], [2,3,1], [3,1,2], and [3,2,1].

解法一:调用库函数next_permutation

vector<vector<int> > permute(vector<int> &num)
    {
        vector<vector<int>>v1;
        if(num.size()==0)
            return v1;
        sort(num.begin(),num.end());//注:必须先进行排序,否则会丢失一些排列
        v1.push_back(num);
        while(next_permutation(num.begin(),num.end()))
        {
            v1.push_back(num);
        }
        return v1;
    }

next_permutation()函数是全排列出该数列后面的所有排列顺序,因此必须提前进行从小到大的排序。 STL库中还有prev_permutation()函数,此函数是排列出该已知数列之前的所有排列,因此如需与next_permutation()函数有相同的效果,需提前将数列进行从大到小的排列。

递归

递归: 例如一组数:1 2 3 4
1.首先保持第一个数字1不变,对2 3 4进行全排列
2.然后保持1 2不变,对3 4进行全排列
3.保持1 2 3不变,对4进行全排列,此时以1为开头的全排列完成
4.此时分别以2,3,4为开头分别完成上述操作

vector<vector<int>> permute(vector<int>& nums)
    {
        vector<vector<int>>v1;
        permutation(nums,0,v1);
        return v1;
    }
    void permutation(vector<int>&nums,int begin,vector<vector<int>>&v1)
    {
        if(begin>=nums.size())
            v1.push_back(nums);
        for(int i=begin;i<nums.size();++i)
        {
            swap(nums[begin],nums[i]);
            permutation(nums,begin+1,v1);
            swap(nums[begin],nums[i]);//需要恢复到变化前
        }
    }
给定一个可包含重复数字的序列,返回所有不重复的全排列。

示例:

输入: [1,1,2]
输出:
[
  [1,1,2],
  [1,2,1],
  [2,1,1]
]

相比较上面无重复元素的代码,只多了一步判断是否有重复元素
代码如下:

vector<vector<int>> permuteUnique(vector<int>& nums)
    {
        vector<vector<int>>v1;
        if(nums.size()==0)
            return v1;
        permuta(v1,0,nums);
        return v1;
    }
    void permuta(vector<vector<int>>&v1,int begin,vector<int>&nums)
    {
        if(begin>=nums.size())
            v1.push_back(nums);
        for(int i=begin;i<nums.size();++i)
        {
            if(!Find(nums,begin,i))//判断是否有重复元素
            {
                swap(nums[begin],nums[i]);
                permuta(v1,begin+1,nums);
                swap(nums[begin],nums[i]);
            }
        }
    }
    bool Find(vector<int>&nums,int begin,int end)
    {
        for(;begin<end;++begin)
        {
            if(nums[begin]==nums[end])
                return true;
        }
        return false;
    }

猜你喜欢

转载自blog.csdn.net/qqkb1016/article/details/80998680
今日推荐