下一个排列:https://leetcode-cn.com/problems/next-permutation/
    图片.png

    思路:简单来说,要找到尽可能靠右的一个数并且与其右侧最接近的比它大的数交换,然后把这个数右侧重新升序排列。整个过程当中要注意区间的排序性质。

    • 从右向左搜索,找到第一个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]即可将其变为升序序列。

    参考代码:

    1. class Solution {
    2. public:
    3. void nextPermutation(vector<int>& nums) {
    4. if (nums.size() <= 1) {
    5. return;
    6. }
    7. int left = -1;
    8. int right = 0;
    9. bool isMax = true;
    10. for (int i = nums.size() - 1; i >= 1; --i) {
    11. if (nums[i - 1] < nums[i]) {
    12. left = i - 1;
    13. isMax = false;
    14. break;
    15. }
    16. }
    17. if (!isMax) {
    18. for (int i = nums.size() - 1; i > left; --i) {
    19. if (nums[i] > nums[left]) {
    20. right = i;
    21. break;
    22. }
    23. }
    24. swap(nums[left], nums[right]);
    25. }
    26. reverse(nums.begin() + left + 1, nums.end());
    27. }
    28. };