LeetCode31 下一个排列

LeetCode第31题

问题描述

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

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

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

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

解题思路

假设有数字序列n~1~n~2~n~3~…n~i~…n~m~,定义左边为高位,右边为低位。从低位向高位逐位比较,

如果n~i~ <= n~i-1~,则继续向高位进位比较下一组(即i–);

如果n~i~>n~i-1~,则在n~i~ ~ n~m~之间寻找比n~i-1~大的最小数字,并与之交换。

最后对n~i~ ~ n~m~数字序列按从小到大进行排序,得到最终数字排列即为答案。

Code

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
class Solution:
def nextPermutation(self, nums):
"""
:type nums: List[int]
:rtype: void Do not return anything, modify nums in-place instead.
"""
i = len(nums) - 1
while i > 0:
if nums[i] > nums[i-1]:
# 从i -> n中选择比nums[i-1]大的最小数字
j = len(nums) - 1
while j >= i:
if nums[j] <= nums[i-1]:
j -= 1
continue
nums[i-1], nums[j] = nums[j], nums[i-1]
break
break
i -= 1

# 将 i -> n 进行翻转,按从小到大排列
k = 0
while k < (len(nums)-1-i) / 2:
nums[i+k], nums[len(nums)-1-k] = nums[len(nums)-1-k], nums[i+k]
k += 1
感谢你对我的支持,让我继续努力分享有用的技术和知识点