LeetCode 31 下一个排列

https://leetcode-cn.com/problems/next-permutation/

实现获取下一个排列的函数,算法需要将给定数字序列重新排列成字典序中下一个更大的排列。

如果不存在下一个更大的排列,则将数字重新排列成最小的排列(即升序排列)。

必须原地修改,只允许使用额外常数空间。

以下是一些例子,输入位于左侧列,其相应输出位于右侧列。
1,2,3 → 1,3,2
3,2,1 → 1,2,3
1,1,5 → 1,5,1

思路:
从最末位寻找第一个破坏升序的数nums[pos - 1], 然后在遍历过的数里寻找比该数大的最小的一个数。
如遍历过的数为[7,6,4,3], nums[pos - 1]为5, 则5需要与6进行交换, 在将[7,5,4,3]改为升序(这里使用reverse)。

遍历过的数从后往前一定是升序, 故改为从前往后升序只需要反转该部分即可。
寻找第一个比nums[pos - 1]大的数, 只需改为从前往后升序之后, 从升序的第一个数开始遍历比较大小即可。

LeetCode 31 下一个排列_第1张图片

class Solution {
public:
    void nextPermutation(vector& nums) {
         int pos = nums.size() - 1;
         while (pos > 0 && nums[pos] <= nums[pos - 1]) {
             pos--;
         }
         reverse(nums.begin() + pos, nums.end());
         if (pos > 0) {
             int start = pos;
             for (; start < nums.size(); start++) {
                 if (nums[start] > nums[pos - 1]) {
                     swap(nums[start], nums[pos - 1]);
                     break;
                 }
             }
         }
    }
};

 

你可能感兴趣的:(LeetCode)