31. 下一个排列

除了要找到后面最大数的前面一个数,还要找到后面某个数比他大就交换。例如:1,3,2,5,4,3我们肯定是先找到2,然后我们在5,4,3中找比2大的数,3比2大,所以2和3交换,得到1,3,3,5,4,2,然后再将3后面的数字5,4,2从小到大排序,最终得到1,3,3,2,4,5

class Solution(object):
    def nextPermutation(self, nums):
        """
        :type nums: List[int]
        :rtype: None Do not return anything, modify nums in-place instead.
        """
        k = 0
        l = 0
        n = len(nums)
        for i in range(n-1, 0, -1):  # 先从后面从大到小排好序的序列中找到比最大值小的数
            if nums[i-1] < nums[i]:
                k = i-1
                break
        for j in range(n-1, 0, -1): # 看看后面排好序的序列中哪个数比nums[k]大
            if nums[j] > nums[k]:
                l = j
                break
        if k!=0 or l!=0:
            nums[k], nums[l] = nums[l], nums[k]  # 先交换这两个数
            nums[k+1:] = sorted(nums[k+1:])     # 再将k后面的数从小到大排好序
        else:
            nums[:] = nums[::-1]
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值