【LeetCode】31. Next Permutation 解题报告(Python)

本文介绍了一种算法,用于找出比给定序列稍大的下一个排列。通过从后向前查找第一个不遵循升序的元素,并找到其后恰大于它的数进行交换,然后将原序列中该位置后的部分逆序,得到结果。如果不存在这样的序列,则返回原序列的逆序。

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

题目分析:

这一题是让我们返回一个恰好大于给定序列的数的序列,如果找不到(即原序列是最大的)就倒序返回。
例子:
1,2,3 → 1,3,2
3,2,1 → 1,2,3
1,1,5 → 1,5,1

代码说明:

上面的例子较短不容易找到规律,如果给定序列:1  2  7  4  3  1,那么结果应该是1  3  1  2  4  7。
变换过程如下:
1  2   7  4  3  1

1  2  7  4  3  1

1  3  7  4  2  1

1  3  1  2  4  7

  1. 因为是找更大的数,那么从后往前看一定是递增的,找到一个突然变小的位置标记如,上面的2
  2. 找到后从变小的位置向后是递减的,因为要恰好大于,那就找到一个恰好大于它的数,上面的3
  3. 互相交换位置
  4. 从原来变小的位置(例子中的2)后面倒序,这个结果就是恰好大于原来的序列

代码中已有注释,不再详细解释

测试代码:

class Solution:
    def nextPermutation(self, nums):
        #length记录数组长度,l用来循环
        length = l = len(nums)
        #记录是否进入循环,如果没有证明是最大的,直接反序
        flag = True
        while(l >= 2):
            #倒序寻找一个前一个小于后一个的位置,用于交换
            if nums[l - 1] > nums[l - 2]:
                flag = False
                left = l - 2
                right = -1
                #寻找一个刚好大于我们要交换的数
                for i in range(l-1, length):
                    if nums[l-2] >= nums[i]:
                        right = i - 1
                        break
                #交换
                nums[left], nums[right] = nums[right], nums[left]
                #后半段反序
                nums[left+1: length] = list(reversed(nums[left+1: length]))
                break
            l -= 1
        #如果没有进入循环证明是最大的,直接反序
        if flag:    nums.reverse()


        print(nums)    #提交时请删除该行
Solution().nextPermutation([1, 2, 7, 4, 3, 1])  #提交时请删除该行

参考文章

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值