Given a collection of distinct 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]
.
这道全排列题是非常经典的面试题,在《剑指Offer》中也出现了类似的题只不过是把整数数组变成了字符串数组,下面给出经典的解法:
class Solution {
public:
vector<vector<int>> permute(vector<int>& nums) {
vector<vector<int>> res;
permute(nums,res,0);
return res;
}
void permute(vector<int>& nums,vector<vector<int>>& res,int low){
if(low>=(nums.size())){
res.push_back(nums);
return;
}else{
for(int i=low;i<nums.size();i++){
int temp=nums[i];
nums[i]=nums[low];
nums[low]=temp;
permute(nums,res,low+1);
temp=nums[i];
nums[i]=nums[low];
nums[low]=temp;
}
}
}
};
关键是理解这个解法中的交换元素的思想:对于当前数组的头元素low,从它本身开始遍历每一个元素和low交换位置,指针移到下一位,进行递归,然后把交换的元素再交换回来,用另一个元素和low交换。