首页 > 试题广场 >

下一个排列

[编程题]下一个排列
  • 热度指数:2092 时间限制: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]
#
# 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
#
# 
# @param nums int整型一维数组 
# @return int整型一维数组
#
class Solution:
    def nextPermutation(self , nums: List[int]) -> List[int]:
        # write code here
        # 判断是否为下降序列
        is_decrese = True
        for i in range(1, len(nums)):
            if nums[i] > nums[i-1]:
                is_decrese = False
        if is_decrese:
            return nums[::-1]

        # 右指针最右边,逐步往左边找比右指针小的值,找到交换返回即可
        # 一次次找,找不到就左移右指针
        right = len(nums)-1
        while right > 0:
            for i in range(right-1, -1,-1):
                if nums[i] < nums[right]:
                    nums[i], nums[right] = nums[right], nums[i]
                    return nums
            right -= 1

        return nums

发表于 2024-04-27 00:04:02 回复(0)
人生苦短,我用Python。
class Solution:
    def nextPermutation(self , nums: List[int]) -> List[int]:
        # write code here
        for i in range(len(nums)-1, 0, -1):
            if nums[i] > nums[i-1]:
                temp_value = nums[-1]
                nums[-1] = nums[i-1]
                nums[i-1] = temp_value
                nums[i:-1] = nums[i:-1:-1]
                return nums
        nums.sort()
        return nums
编辑于 2024-04-11 17:30:08 回复(0)
class Solution:
    def nextPermutation(self , nums: List[int]) -> List[int]:
        # write code here
        if len(nums) < 2 :
            return nums
        p1 = 0
        p2 = len(nums) - 2
        
        flag = 0
        while p2 >= 0:
            for i in range(p2, len(nums)):
                if nums[i] > nums[p2]:
                    tmp = nums[i]
                    nums[i] = nums[p2]
                    nums[p2] = tmp
                    flag = 1
                    break
            if flag == 1:
                break
            else:
                p2 -= 1
        if flag == 0:
            nums.sort()
        
        return nums


发表于 2022-03-02 10:30:55 回复(1)

问题信息

难度:
3条回答 1673浏览

热门推荐

通过挑战的用户

查看代码