力扣 31. 下一个排列

64 阅读1分钟

🔗 leetcode.cn/problems/ne…

题目

  • 给一个数组,返回这个数组的下一个排列

思路

  • 数学题

  • 从后往前找第一个升序,表明有下一个字典序的排列组合,即 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;
            }
        }
    }
};