LeetCode 31. 下一个排列

31. 下一个排列

题目:整数数组的一个 排列 就是将其所有成员以序列或线性顺序排列。 给你一个整数数组 nums ,找出 nums 的下一个排列。 必须 原地 修改,只允许使用额外常数空间。 (题意不是很明确,具体看链接,看不懂可以看评论) 链接

官方思路

注意 如果在步骤 1 找不到顺序对,说明当前序列已经是一个降序序列,即最大的序列,我们直接跳过步骤 2 执行步骤 3,即可得到最小的升序序列。 该方法支持序列中存在重复元素,且在 C++ 的标准库函数 next_permutation 中被采用。

class Solution:
    def nextPermutation(self, nums: List[int]) -> None:
        i = len(nums) - 2
        while i >= 0 and nums[i] >= nums[i + 1]:
            i -= 1
        if i >= 0:
            j = len(nums) - 1
            while j >= 0 and nums[i] >= nums[j]:
                j -= 1
            nums[i], nums[j] = nums[j], nums[i]
        
        left, right = i + 1, len(nums) - 1
        while left < right:
            nums[left], nums[right] = nums[right], nums[left]
            left += 1
            right -= 1

复杂度分析 时间复杂度:O(N),其中 N 为给定序列的长度。我们至多只需要扫描两次序列,以及进行一次反转操作。 空间复杂度:O(1),只需要常数的空间存放若干变量。

经验分享 程序员 微信小程序 职场和发展