下一个排列:https://leetcode-cn.com/problems/next-permutation/
思路:简单来说,要找到尽可能靠右的一个数并且与其右侧最接近的比它大的数交换,然后把这个数右侧重新升序排列。整个过程当中要注意区间的排序性质。
- 从右向左搜索,找到第一个nums[i] < nums[i + 1]. 注意此时[i + 1, n - 1]区间必然为降序序列。
- 从右向左搜索,找到第一个nums[j] > nums[i],然后交换nums[i]和nums[j]。注意交换后[i + 1, n - 1]依然是降序序列。
- 翻转[i + 1, n - 1]即可将其变为升序序列。
参考代码:
class Solution {
public:
void nextPermutation(vector<int>& nums) {
if (nums.size() <= 1) {
return;
}
int left = -1;
int right = 0;
bool isMax = true;
for (int i = nums.size() - 1; i >= 1; --i) {
if (nums[i - 1] < nums[i]) {
left = i - 1;
isMax = false;
break;
}
}
if (!isMax) {
for (int i = nums.size() - 1; i > left; --i) {
if (nums[i] > nums[left]) {
right = i;
break;
}
}
swap(nums[left], nums[right]);
}
reverse(nums.begin() + left + 1, nums.end());
}
};