题目描述
给定一个没有重复数字的序列,返回其所有可能的全排列。
示例:
输入: [1,2,3]
输出:
[
[1,2,3],
[1,3,2],
[2,1,3],
[2,3,1],
[3,1,2],
[3,2,1]
]
参考代码
无重复数字时:
class Solution {
public:
vector<vector<int> > permute(vector<int>& nums) {
int length = nums.size();
vector<vector<int> > res;
if(length == 0)
return res;
permutationRecursively(nums, 0, length, res);
return res;
}
void permutationRecursively(vector<int> &nums, int mStart, int length, vector<vector<int> > &res){
if(mStart == length){
res.push_back(nums);
return;
}
for(int i = mStart; i < length; i++){
swap(nums[mStart], nums[i]);
permutationRecursively(nums, mStart + 1, length, res);
swap(nums[mStart], nums[i]);
}
}
};
有重复数字时:
// 基于46题,增加去重
class Solution {
public:
vector<vector<int>> permuteUnique(vector<int>& nums) {
int length = nums.size();
vector<vector<int> > res;
if(length == 0)
return res;
// sort(nums.begin(), nums.end()); // 先对候选数组排序的目的是 便于剪枝和去重。
permutationRecursively(nums, 0, length, res);
return res;
}
void permutationRecursively(vector<int>& nums, int mStart, int length, vector<vector<int> > &res){
if(mStart == length){
res.push_back(nums);
return;
}
for(int i = mStart; i < length; i++){
// 考虑重复数字(这里不能只这么简单的写,因为nums的元素顺序其实一直会变,并不能保证有序,这里可以类比第90题,其实思想是一样的)
// if(i > mStart && nums[i] == nums[i-1])
// continue;
// 考虑重复数字
bool duplication = false;
for(int j = mStart; j < i; j++){
if(nums[j] == nums[i]){
duplication = true;
break;
}
}
if(duplication) continue;
swap(nums[mStart], nums[i]);
permutationRecursively(nums, mStart+1, length, res);
swap(nums[mStart], nums[i]);
}
}
};
本文深入解析了全排列算法,包括无重复数字和有重复数字序列的所有可能排列的生成方法。通过递归算法实现,详细解释了如何避免重复排列,适用于算法理解和面试准备。
910

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



