【leetcode系列】【算法】【中等】下一个排列

题目:

原题链接: https://leetcode-cn.com/problems/next-permutation/

 

解题思路:

这道题的意思,是将数组中的元素,认为是一个数字,只是将每一位都单独拆了出来

使用已有的数字,组成一个比当前数字大的数字中,最小的一个

如果没有,就返回能够组成的最小数字

 

查找的逻辑如下:

从后往前遍历,假设当前遍历元素的下标为idx,遍历时规则如下:

  1. 如果 [idx] <= [idx - 1],继续向前遍历
  2. 如果 [idx] > [idx - 1],记录idx - 1的值,对idx开始的元素排序,并找到后续元素中,比[idx - 1]大的最小一个值,与[idx - 1]的值进行交换(排序和交换值的顺序不影响结果)

借用leetcode题解中的动图示例如下:

Next Permutation

 

 

代码实现:

class Solution:
    def nextPermutation(self, nums: List[int]) -> None:
        """
        Do not return anything, modify nums in-place instead.
        """
        for i in range(len(nums) - 1, 0, -1):
            if nums[i] > nums[i - 1]:
                tmp_nums = nums[i:]
                tmp_nums.sort()
                nums[i:] = tmp_nums
                for j in range(i, len(nums)):
                    if nums[j] > nums[i - 1]:
                        nums[i - 1], nums[j] = nums[j], nums[i - 1]
                        break
                return
            
        nums.sort()

发布了88 篇原创文章 · 获赞 0 · 访问量 1223
App 阅读领勋章
微信扫码 下载APP
阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 大白 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览