@author: ZZQ

@software: PyCharm

@file: nextPermutation.py

@time: 2018/11/12 15:32

要求:

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

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

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

以下是一些例子,输入位于左侧列,其相应输出位于右侧列。

1,2,3 → 1,3,2

3,2,1 → 1,2,3

1,1,5 → 1,5,1

思路: 从数组尾部向前搜索,找到第一次nums[i] 比nums[i+1]小的位置,

将该位置i记录下来,然后将该位置之后的所有元素进行排列,找到比nums[i]大的第一个元素,将两数交换即可。

class Solution():
def __init__(self):
pass def quickSort(self, list, left, right): if left > right:
return
middle_value = list[left]
i = left
j = right while i < j:
while i < j and list[j] >= middle_value:
j -= 1
while i < j and list[i] <= middle_value:
i += 1 if i < j:
t = list[i]
list[i] = list[j]
list[j] = t list[left] = list[i]
list[i] = middle_value
self.quickSort(list, left, i-1)
self.quickSort(list, i+1, right) def nextPermutation(self, nums):
"""
:type nums: List[int]
:rtype: void Do not return anything, modify nums in-place instead.
"""
nums_len = len(nums)
index = 0
small_value = -1
if nums_len == 0:
return nums
for i in range(nums_len-1):
if nums[nums_len-1-i-1] < nums[nums_len-1-i]:
index = nums_len-1-i
small_value = nums[nums_len-1-i-1]
break
if small_value == -1:
nums.sort(reverse=False)
return nums
self.quickSort(nums, index, nums_len-1)
for j in range(index, nums_len):
if nums[j] > small_value:
t = nums[j]
nums[j] = nums[index-1]
nums[index-1] = t
break
return nums

Leetcode题库——31.下一个排列的更多相关文章

  1. Java实现 LeetCode 31下一个排列

    31. 下一个排列 实现获取下一个排列的函数,算法需要将给定数字序列重新排列成字典序中下一个更大的排列. 如果不存在下一个更大的排列,则将数字重新排列成最小的排列(即升序排列). 必须原地修改,只允许 ...

  2. LeetCode 31. 下一个排列 | Python

    31. 下一个排列 题目 实现获取下一个排列的函数,算法需要将给定数字序列重新排列成字典序中下一个更大的排列. 如果不存在下一个更大的排列,则将数字重新排列成最小的排列(即升序排列). 必须原地修改, ...

  3. Leetcode题目31.下一个排列(中等)

    题目描述: 实现获取下一个排列的函数,算法需要将给定数字序列重新排列成字典序中下一个更大的排列. 如果不存在下一个更大的排列,则将数字重新排列成最小的排列(即升序排列). 必须原地修改,只允许使用额外 ...

  4. LeetCode 31. 下一个排列(Next Permutation)

    题目描述 实现获取下一个排列的函数,算法需要将给定数字序列重新排列成字典序中下一个更大的排列. 如果不存在下一个更大的排列,则将数字重新排列成最小的排列(即升序排列). 必须原地修改,只允许使用额外常 ...

  5. leetcode 31下一个排列

    /** 验证一般情况(元素数目大于等于3)有几个情况分析:两个特殊情况: 6 5 4 3 2 1 完全反序,这种序列没有下一个排序,因此重新排序1 2 3 4 5 6 1 2 3 4 5 6 完全升序 ...

  6. 代码题(45)— 下一个排列、第k个排列

    1.31. 下一个排列 实现获取下一个排列的函数,算法需要将给定数字序列重新排列成字典序中下一个更大的排列. 如果不存在下一个更大的排列,则将数字重新排列成最小的排列(即升序排列). 必须原地修改,只 ...

  7. leetcode题库

    leetcode题库 #题名题解通过率难度出现频率  1 两数之和     46.5%简单2 两数相加     35.5%中等3 无重复字符的最长子串     31.1%中等4 寻找两个有序数组的中位 ...

  8. ACM_下一个排列

    The Next Permutation Time Limit: 2000/1000ms (Java/Others) Problem Description: For this problem, yo ...

  9. LeetCode:下一个排列【31】

    LeetCode:下一个排列[31] 题目描述 实现获取下一个排列的函数,算法需要将给定数字序列重新排列成字典序中下一个更大的排列. 如果不存在下一个更大的排列,则将数字重新排列成最小的排列(即升序排 ...

随机推荐

  1. c++类模板之友元函数

    前言:自从开始学模板了后,小编在练习的过程中.常常一编译之后出现几十个错误,而且还是那种看都看不懂那种(此刻只想一句MMP).于是写了便写了类模板友元函数的用法这篇博客.来记录一下自己的学习. 普通友 ...

  2. 实现一个自定义event事件,包括on ,off,trigger,once

    on监听事件,off取消事件 ,trigger触发事件,once只执行一次 class Event { constructor() { this.handlers = {};//记录所有的事件以及处理 ...

  3. 阿里云服务器+宝塔环境+LNMP+tp5.1安装和调试

    1.首先肯定得有个阿里云服务器,楼主是用来自己测试用得,所以就买了个1年得突发性实例,虽然网上都说别买这种,不过个人测试还是没有多少要求得 2.买了服务器之前可以顺带买个域名,再顺带去备案一下,阿里云 ...

  4. 人生苦短,我用python

    星空不问赶路人,时光不负有心人,你可以脱变. 1.计算机的初步认识 2.解释器的安装 python2.7(2020年官方不在维护) python3.6 (官方推荐) 1.下载安装包 https://w ...

  5. Scala(一):函数、流程控制、参数

    Function:函数函数的定义: def 函数名(参数):返回类型=函数实现体 eg:def abs(x:Long) : Long = if(x >= 0) x else -x 你必须给出所有 ...

  6. 3.Functions-函数(Dart中文文档)

    初次翻译,部分内容并非按字面翻译,是按本人理解进行了内容重组.如有错误望指正. Dart是完全的面向对象的语言,甚至函数也是一个Function类型的对象.这意味着函数可以赋值给变量或者作为函数的参数 ...

  7. 用margin实现两列布局中的自适应列

    <div id="wrapper"> <div id="col1"> "fixed" </div> &l ...

  8. .Net Core使用Unity替换原生DI

    原文:.Net Core使用Unity替换原生DI 一.DIP.IOC.DI 面对对象设计原则可以帮助我们开发出更好的程序,其中有一个依赖倒置原则DIP并由此引申出IOC.DI等概念.就先粗略的了解一 ...

  9. ZJOI2018 round^2 游记

    Day0 一早起来6点左右,吃完早饭去班里拿了书包就来机房,说实话怕被打[手动滑稽]. 在车上大约经历了3个半小时的车程,终于到达了目的地:余姚.当然基本上大家的设备电量都不多了,除了某些上车睡觉的大 ...

  10. CF 700 E. Cool Slogans

    E. Cool Slogans 链接 题意: 给定一个字符串S,从中选出k个子串a[1],a[2]...a[k],满足a[i]在a[i+1]中出现了两次(可以重叠),求最大的k. 分析: 建出SAM, ...