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。(逃