美文网首页
每日一题20201118(31. 下一个排列)

每日一题20201118(31. 下一个排列)

作者: 米洛丶 | 来源:发表于2020-11-18 14:28 被阅读0次

31. 下一个排列

image-20201118141644763

思路

首先说一下什么是字典序,把1 2 3当作a b c的话,abc有6种排列顺序。

abc acb bac bca cab cba

上图就是字典序,题目的要求狠简单: 找到下一个字典序,如果没有的话,则输出最小的序号。

首先明确一下,没有下一个序列的情况,那么就是大的全部在前面,所以只需要反转数组就行,就可以回到最小的序列。

再看有下一个排序的情况,我们需要先从右侧找到一个比最右边数字小的数.

然后再和右边第一个大于这个数的数进行交换,以571632为例子:

第一个小于右侧数字的数是1,第一个大于1的数字是2,交换之后:

572631, 由于之前确定的,是通过升序找到的1,所以还需要反转2后面的数字: 572136 就是最终结果了!

正好可以和上面反转的一起处理。
class Solution:
    def nextPermutation(self, nums: List[int]) -> None:
        """
        Do not return anything, modify nums in-place instead.
        """
        # 左侧的第一个非升序数字,这里也可以len(nums)-2
        j = len(nums)-1
        while j-1 >= 0:
            if nums[j] > nums[j-1]:
                break
            j -= 1
        # 如果j-1>=0说明找到了这个数字,否则说明数组
        # 是降序排列的
        if j-1 >= 0:
            right = len(nums)-1
            # 找到右边第一个大于nums[j-1]的数字
            while right > j-1 and nums[right] <= nums[j-1]:
                right -= 1
            # 交换他们
            nums[j-1], nums[right] = nums[right], nums[j-1]
            self.reverse(nums, j, len(nums)-1)
        else:
            self.reverse(nums, 0, len(nums)-1)
            
    # 反转数组
    def reverse(self, nums, i, j):
        while i < j:
            nums[i], nums[j] = nums[j], nums[i]
            i += 1
            j -= 1
        return nums

image-20201118142757008

相关文章

  • 每日一题20201118(31. 下一个排列)

    31. 下一个排列[https://leetcode-cn.com/problems/next-permutati...

  • LeetCode-31-下一个排列

    LeetCode-31-下一个排列 31. 下一个排列[https://leetcode-cn.com/probl...

  • LeetCode 31. 下一个排列 | Python

    31. 下一个排列 题目 实现获取下一个排列的函数,算法需要将给定数字序列重新排列成字典序中下一个更大的排列。 如...

  • 31. 下一个排列

    31. 下一个排列 实现获取下一个排列的函数,算法需要将给定数字序列重新排列成字典序中下一个更大的排列。 如果不存...

  • 全排列问题偷鸡做法

    全排列问题偷鸡摸狗做法用强大的(猥琐的)next_permutation 31. 下一个排列 46. 全排列 47...

  • LeetCode每日一题: 31. 下一个排列

    31. 下一个排列 实现获取下一个排列的函数,算法需要将给定数字序列重新排列成字典序中下一个更大的排列。如果不存在...

  • 【LeetCode】排列问题

    31.下一个排列 实现获取下一个排列的函数,算法需要将给定数字序列重新排列成字典序中下一个更大的排列。如果不存在下...

  • 31. 下一个排列

    31. 下一个排列 题目链接:https://leetcode-cn.com/problems/next-perm...

  • LeetCode-31 下一个排列

    题目:31. 下一个排列 难度:中等 分类:数组 解决方案:数组遍历 今天我们学习第31题下一个排列,这是一个中等...

  • ARTS打卡第六周

    ARTS打卡第六周 Algorithm:每周至少做一个 leetcode 的算法题 31. 下一个排列 代码: 官...

网友评论

      本文标题:每日一题20201118(31. 下一个排列)

      本文链接:https://www.haomeiwen.com/subject/hcdciktx.html