题目: 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].
思路: 全排列的问题解法很多,本文列出三种,第二种来自于leetcode讨论区。
解法一: 递归解决,最常见的思路
class Solution {
public:
vector<vector<int>> permute(vector<int>& nums) {
vector<vector<int>> result;
if(nums.size()==0)
return result;
permutation(nums,nums.begin(),result);
return result;
}
void permutation(vector<int>& nums,vector<int>::iterator start,vector<vector<int>>& result)
{
if(start==nums.end())
{
result.push_back(nums);
return;
}
else
{
for(auto p=start;p!=nums.end();++p)
{
iter_swap(p,start);
permutation(nums,start+1,result);
iter_swap(p,start);
}
}
}
};
解法二: 非递归解法,来自于leetcode讨论区,还不太理解,先贴在这
vector<vector<int>> permute(vector<int>& nums) {
vector<vector<int>> result(1);
for(int i = 0;i<nums.size();i++){
generatenew(result,nums[i]);
}
return result;
}
void generatenew(vector<vector<int>> &result, int a){
int size = result.size();
int size_sub = result[0].size();
for(int i = 0;i<size;i++){
result[i].push_back(a);
for(int j =0;j<size_sub;j++){
vector<int> newform = result[i];
swap(newform[j],newform[size_sub]);
result.push_back(newform);
}
}
}
解法三: 采用STL,STL中的库函数next_permutation关于全排列的解法和上边的两种都不一样,所以也列在这。
class Solution {
public:
vector<vector<int>> permute(vector<int>& nums) {
vector<vector<int>> result;
sort(nums.begin(),nums.end());
result.push_back(nums);
while(next_permutation(nums.begin(),nums.end()))
result.push_back(vector<int>(nums.begin(),nums.end()));
return result;
}
};
测试结果: 这几种算法的效率差不多,都是击败了77.58%的程序,那就说明还有更好的代码。
题目二: Given a collection of numbers that might contain duplicates, return all possible unique permutations.
For example,
[1,1,2] have the following unique permutations:
[1,1,2], [1,2,1], and [2,1,1].
解法: 这道题可以用上边的解法3来解决。代码就不贴了。