LeetCode中的一道穷举数组序列的所有排列方式的题目,按照一般的习惯思考会采用深度优先搜索算法,但刷这题之前恰巧遇过31. 下一个排列,想到一种比较特别的解法:遍历输入数组的下一个排列,循环直至重复,然后输出所有结果。
class Solution {
public:
vector<vector<int>> permute(vector<int>& nums) {
vector<vector<int>> res(1,nums);
vector<int> nextVec = nums;
while(true) {
nextVec = nextPermutation(nextVec);
if(nextVec == nums) {
return res;
}
else {
res.push_back(nextVec);
}
}
return res;
}
private:
vector<int> nextPermutation(const vector<int>& nums) {
if(nums.size() <= 1) {
return nums;
}
vector<int> nextVec = nums;
int firstUpIndex = -1;
for(int i=nums.size()-2;i>=0;i--) { // 从后往前找到第一个升序的相邻因素
if(nums[i] < nums[i+1]) {
firstUpIndex = i;
break;
}
}
if(firstUpIndex == -1) {
reverse(nextVec.begin(), nextVec.end());
return nextVec;
}
int firstBiggerIndex = firstUpIndex;
for(int i=nums.size()-1;i>firstUpIndex;i--) {
if(nums[i] > nums[firstUpIndex]) {
firstBiggerIndex = i;
break;
}
}
int temp = nextVec[firstUpIndex];
nextVec[firstUpIndex] = nextVec[firstBiggerIndex];
nextVec[firstBiggerIndex] = temp;
reverse(nextVec.begin()+firstUpIndex+1, nextVec.end());
return nextVec;
}
};