【python/M/31】Next Permutation

本文介绍了一个用于生成给定数字序列下一个字典序排列的经典算法。该算法首先从序列末尾找到第一个升序对,接着找到并交换一个比该位置大的数,最后将原位置后的子序列反转。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目

这里写图片描述

基本思路

输出字典序中的下一个排列。比如123生成的全排列是:123,132,213,231,312,321。那么321的next permutation是123。下面这种算法据说是STL中的经典算法。
举例为:14532
1. 首先从后向前找到相邻的两个升序元素,45,将partition指向4
2. 在从尾端找出另一个大于partition的数字,在与partition指向的数字进行交换
3. 然后将partition之后的数字进行逆序排列

代码

class Solution:
    def nextPermutation(self, nums):
        """
        :type nums: List[int]
        :rtype: void Do not return anything, modify nums in-place instead.
        """
        partition = -1
        length = len(nums)

        if length <= 1:
            return nums

        for i in range(length-2,-1,-1):
            if nums[i] < nums[i+1]:
                partition = i
                break

        if partition == -1:
            nums = nums.reverse()
            return nums
        else:
            for i in range(length-1,partition,-1):
                if nums[i] > nums[partition]:
                    nums[i],nums[partition] = nums[partition],nums[i]
                    break

        nums[partition + 1:] = nums[partition + 1:][::-1]

        return nums

运行结果

emmmmm,他总是说我没有返回东西,因为我在原地进行了修改,好晕,没法改,不知道哪里有问题。。。。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值