下一个排列: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());}};
