046 Permutations[M]

1 题目描述

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

难度:Medium

2 题目样例

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

[
  [1,2,3],
  [1,3,2],
  [2,1,3],
  [2,3,1],
  [3,1,2],
  [3,2,1]
]

3 题意分析

这题目的题设一点废话也没有,给你一个数组,让你返回数组中所有元素的全排列。数组中的元素是互异的。

看到这个题设我就很机灵的想起了之前做的一道与之类似的题…只不过那个题目只需要求下一个排列就可以了,而这个题目需要求的是所有的排列(详情参见031 Next Permutation[M])

不过…我只要一直使用我在Next Permutation中所写的函数,或许就可以得到全排列了吧?

4 思路分析

实现Next Permutation的具体思路请参见031 Next Permutation[M]

本题的代码实现如下:

class Solution 

{
    
public:
       
    vector<vector<int> > permute(vector<int> &num) 
    
    {
        vector<vector<int> > res;
        
        if(num.size() == 0)return res;
        
        sort(num.begin(), num.end());
        
        res.push_back(num);
        
        while(mynext_permutation(num))res.push_back(num);
        
        return res;
    }
     
    bool mynext_permutation(vector<int>&num)
        
    {
        int n = num.size();
        
       if(n <= 1)return false;
        
       for(int i = n-2, ii = n-1; i >= 0; i--,ii--)
           
       {
           
           if(num[i] < num[ii])
               
           {
               int j = n-1;
               
               while(num[j] <= num[i])j--;
               
               swap(num[i], num[j]);
               
               reverse(num.begin()+ii, num.end());
               
               return true;
           }
       }
        
       reverse(num.begin(), num.end());
        
       return false;
    }
};
    

当然,如果你知道有一个STL函数next_permutation的话,直接偷懒也是很OK的。

代码实现如下:

class Solution 

{
    
public:
       
   vector<vector<int>> permute(vector<int>& nums)
   
   {  
       
        vector<vector<int>> result;  

        sort(nums.begin(), nums.end());  

        do

        {  
            result.push_back(nums);  
        }

           while(next_permutation(nums.begin(), nums.end()));  

        return result;  
    }  
};

但这次STL的速度没有超过我们自己手写的函数,有点吃惊。

5 后记

全排列问题在面试中似乎是一个相当常见的问题。请各位务必留心。

况且接下来还有permutations II。(逃

    原文作者:Lolita
    原文地址: https://zhuanlan.zhihu.com/p/34452890
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞