首页 > 试题广场 >

下一个排列

[编程题]下一个排列
  • 热度指数:2071 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解
给定一个数组,将数组重新排列,得到一系列数组排列S,请你从S中,找出恰好比当前数组排列字典序大于1的数组排列。
1.[1,2,3]的得到的数组排列S有:[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]。
2.该题数组排列的字典序大小排序规则:2个数组排列的元素按顺序比较,直到数组元素不相等为止,不相等的第一个元素,谁的元素大,谁的字典序比较大,比如数组a=[1,2,3]与数组b=[1,3,2]比较:a[0]=b[0],a[1]<b[1],此时出现了第一个不相同的,且a[1]<b[1],则a的字典序小于b的字典序。且[1,3,2]的字典序在排列S中,正好在[1,2,3]的后面,视为[1,3,2]的字典序比[1,2,3]的字典序大于1。
3.如果不存在更大的数组排列,则返回最小的数组排列。

数据范围:排列长度满足 ,排列中的值满足
示例1

输入

[1,2,3]

输出

[1,3,2]
示例2

输入

[3,2,1]

输出

[1,2,3]

说明

[3,2,1]是当前最大的数组排列了,不存在比它更大的了,故返回最小的数组排列      
示例3

输入

[2]

输出

[2]
class Solution:
    def nextPermutation(self, nums: List[int]) -> None:
        # 思考:
        # 1. 对于某个位置i,如果前面保持相同,而位置i的数变大,那么就形成了更大的排列(定义)。
        # 2. 因此,只能从位置i后面的位置取更大的数放到位置i来,就不会影响前面的结果,此时位置i越靠右越好。
        # 因此问题的关键是:需要找到位置i,使得位置i后面存在一个刚好比位置i的数大的数,那我们把这个数放到位置i,就使得前面不变,而将位置i的数稍微变大了;然后将后面再排序一下,使得后面构成最小的排列。
        n = len(nums)
        exist = False # 是否存在后面一个数比位置i的数更大
        for i in range(n-1, -1, -1):
            if max(nums[i:]) > nums[i]:
                exist = True
                break
        if not exist: # 如果不存在,意味着整个数组是递减的,反序输出即可。
            return nums[::-1]
        # 寻找后面刚好比nums[i]稍大的那个数的位置minlargej
        minlargej, minlarge = i, float('inf')
        for j in range(i+1, n):
            diff = nums[j]-nums[i]
            if diff > 0 and diff < minlarge:
                minlarge = diff
                minlargej = j
        nums[i], nums[minlargej] = nums[minlargej], nums[i] # 交换一下,使得nums[i]稍微变大
        nums[i+1:] = sorted(nums[i+1:]) # 排序一下后面的数组,形成最小的排列
        return nums

编辑于 2024-04-02 10:36:10 回复(0)
class Solution:
    def nextPermutation(self , nums: List[int]) -> List[int]:
        # write code here
        if len(nums)==1:return nums
        for i in range(len(nums)-1,0,-1):
            if nums[i]>nums[i-1]:
                t = nums[i]
                nums[i] = nums[i-1]
                nums[i-1] = t
                return nums
        return nums[::-1]

发表于 2022-03-04 12:22:19 回复(1)