Leetcode031 next-permutation

下一个排列

题目描述:

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

如果不存在下一个更大的排列,则将数字重新排列成最小的排列(即升序排列)。

必须原地修改,只允许使用额外常数空间。

以下是一些例子,输入位于左侧列,其相应输出位于右侧列。
1,2,31,3,2
3,2,11,2,3
1,1,51,5,1


解题思路:

  • 首先先找到从尾部升序结束的点,因为这个点使我们需要修改的位置
  • 然后判断这个位置是不是这个数值的第一个位置,如果是,意味着这是数值是最大的,则直接进行sort()排序
  • 从后往前找第一个大于该位置j点的值
  • 然后进行交换,同时获得从小到大排序后j点之后的数值数组a
  • 将数组a的值插入到j点之后即可

Python源码:

class Solution:
    def nextPermutation(self, nums: 'List[int]') -> 'None':
        """
        Do not return anything, modify nums in-place instead.
        """
        i = len(nums) - 1
        if len(list(set(nums))) != 1:
            
            #先从尾部升序结束的点
            while i - 1 >= 0:
                if nums[i] <= nums[i - 1]:
                    i = i - 1
                else:
                    break
            #如果前面还有至少一个位置
            if i - 1 >= 0:
                j = i - 1
 
                t = len(nums) - 1
                #从后往前找第一个大于j位置上的数
                while nums[t] <= nums[j]:
                    t -= 1
                nums[t], nums[j] = nums[j], nums[t]
                a = sorted(nums[i:])
                a_index = 0
                #以下是对nums的排序
                for index in range(i, len(nums)):
                    nums[index] = a[a_index]
                    a_index += 1
            #没有位置则sort
            else:
                nums.sort()

欢迎关注我的github:https://github.com/UESTCYangHR

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 排序算法说明 (1)排序的定义:对一序列对象根据某个关键字进行排序; 输入:n个数:a1,a2,a3,…,an 输...
    code武阅读 3,933评论 0 0
  • 概述 排序有内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部...
    蚁前阅读 10,610评论 0 52
  • 第5章 引用类型(返回首页) 本章内容 使用对象 创建并操作数组 理解基本的JavaScript类型 使用基本类型...
    大学一百阅读 8,904评论 0 4
  • 第五章******************************************************...
    fastwe阅读 4,042评论 0 0
  • 由山东省教育厅主办山东体育学院承办、山东省学校体育协会协办的山东省第七届高校体育教育专业学生基本功大赛将于6月份在...
    火山火兰阅读 1,495评论 0 0

友情链接更多精彩内容