题目描述
实现获取下一个排列的函数,算法需要将给定数字序列重新排列成字典序中下一个更大的排列。
如果不存在下一个更大的排列,则将数字重新排列成最小的排列(即升序排列)。
必须原地修改,只允许使用额外常数空间。
以下是一些例子,输入位于左侧列,其相应输出位于右侧列。
1,2,3 → 1,3,2
3,2,1 → 1,2,3
1,1,5 → 1,5,1
解题思路
没有用到什么复杂的算法,重点是理解题目要做什么。
1、观察示例,输入如果是降序排序,则需要变成升序排列
2、有下一个排序的输入,都是在调整后面数字的顺序,所以,数组的遍历顺序应该是从右到左。
3、从右到左遍历时,如果相邻两个数字,左边的比右边的小,则说明存在下一个较大排序,转到4,否则转到5
4、左边之后的数字进行升序排列,找到第一个比左边的数字大的数字,然后交换位置,终止循环
5、此时数组是降序排序,对整个数组进行升序排列即可。
注意:sort()方法无法对列表的切片进行排序,sorted()方法可以。
class Solution:
def nextPermutation(self, nums: List[int]) -> None:
"""
Do not return anything, modify nums in-place instead.
"""
biggest = True
n = len(nums)
for i in range(n-2,-1,-1):
if nums[i] < nums[i+1]:
biggest = False
#nums[(i+1):].sort()
nums[(i + 1):] = sorted(nums[(i + 1):])
for j in range(i+1,n):
if nums[i] < nums[j]:
nums[i],nums[j] = nums[j],nums[i]
break
break
if biggest:
nums.sort()
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/next-permutation