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

简介: 下一个排列演示

31. 下一个排列


26.jpg

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

27.jpg

image-20201118142757008




相关文章
|
18天前
|
算法 搜索推荐
每日一题——下一个排列
每日一题——下一个排列
|
10月前
|
人工智能 BI
牛客 序列排列1
牛客 序列排列1
43 0
|
18天前
|
算法
【剑指offer】-字符串的排列-26/67
【剑指offer】-字符串的排列-26/67
|
7月前
|
存储 算法 Serverless
代码随想录算法训练营第六天 | LeetCode 242.有效的字母异位词、349. 两个数组的交集、202. 快乐数、1. 两数之和
代码随想录算法训练营第六天 | LeetCode 242.有效的字母异位词、349. 两个数组的交集、202. 快乐数、1. 两数之和
49 0
代码随想录算法训练营第六天 | LeetCode 242.有效的字母异位词、349. 两个数组的交集、202. 快乐数、1. 两数之和
|
10月前
|
容器
LeetCode-31 下一个排列
LeetCode-31 下一个排列
|
12月前
剑指offer 39. 数字排列
剑指offer 39. 数字排列
54 0
|
算法 C++
C/C++每日一练(20230510) 编辑距离、多数元素、数列累和
C/C++每日一练(20230510) 编辑距离、多数元素、数列累和
61 0
|
机器学习/深度学习 人工智能
【第十五届蓝桥杯备赛(bushi,写文凑个数)】蓝桥OJ---排列序数
文章目录 一、题目 1、原题链接 2、题目描述 二、解题报告 1、思路分析 2、时间复杂度 3、代码详解 三、知识风暴 DFS
75 0
LeetCode每日一题——667. 优美的排列 II
给你两个整数 n 和 k ,请你构造一个答案列表 answer ,该列表应当包含从 1 到 n 的 n 个不同正整数,并同时满足下述条件:
61 0