LeetCode.31. 下一个排列

原题链接:https://leetcode-cn.com/problems/next-permutation/
不太清楚下一个排列是什么意思,直接参考官方给出的解题步骤。
同样举一个例子:
对于一个列表:
1 3 4 2 7 5 3 1
第一步从列表的末尾开始向前找到一个比后一个数小的数。
就是红色标识数字2
1 3 4 2 7 5 3 1
然后找到2以前从后往前第一个比2大的数就是3.
1 3 4 2 7 5 3 1
交换这两数。
1 3 4 3 7 5 2 1
然后翻转3 以后的列表。
1 3 4 3 1 2 5 7
这样就得到下一个排列。
下面是python3代码。

class Solution(object):
    def nextPermutation(self, nums):
        """
        :type nums: List[int]
        :rtype: void Do not return anything, modify nums in-place instead.
        """
        def reverse(nums,i,j): # 翻转列表
             while i < j:
                 nums[i], nums[j] = nums[j], nums[i]
                 i, j = i+1, j-1
        
        length  = len(nums) - 1
        i = length - 1
        j = length
        while i >= 0 and nums[i] >= nums[i+1]:# 从后往前寻找第一个不大于的数nums[i]
            i -= 1
        if i >=0:
            while nums[j] <= nums[i]:# 从后往前寻找第一个大于nums[i]的数nums[j]索引j
                j -= 1
        nums[i],nums[j] = nums[j],nums[i]#交换数字
        reverse(nums,i+1,length)#翻转数组
        
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值