题目
- 给一个数组,返回这个数组的下一个排列
思路
-
数学题
-
从后往前找第一个升序,表明有下一个字典序的排列组合,即 nums [i] < nums [i+1]
- 若没有,则表明该序列已是字典序最大值,通过 swap 改为字典序最小值返回
-
从后往前找第一个大于 nums[i] 的数,swap
-
[i+1, end) 为逆序,通过 swap 改为字典序最小值返回
代码
class Solution {
public:
void nextPermutation(vector<int>& nums) {
int n = nums.size();
if (n == 1)
return;
int index = -1;
for (int i = n - 2; i >= 0; i--) {
if (nums[i] < nums[i + 1]) {
index = i;
break;
}
}
if (index == -1) {
for (int i = 0; i < n / 2; i++) {
swap(nums[i], nums[n - i - 1]);
}
return;
}
for (int i = n - 1; i > index; i--) {
if (nums[i] > nums[index]) {
swap(nums[i], nums[index]);
int k1 = index + 1;
int k2 = n - 1;
while (k1 < k2) {
swap(nums[k1], nums[k2]);
k1++;
k2--;
}
return;
}
}
}
};