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交换。
本文介绍了一个经典的全排列算法实现,并通过C++代码示例详细解释了递归与元素交换思想的应用。该算法能够生成给定不重复数字集合的所有可能排列。
533

被折叠的 条评论
为什么被折叠?



