31.下一个排列
题目描述
实现获取 下一个排列 的函数,算法需要将给定数字序列重新排列成字典序中下一个更大的排列。
如果不存在下一个更大的排列,则将数字重新排列成最小的排列(即升序排列)。
必须 原地 修改,只允许使用额外常数空间。
示例
输入:nums = [1,2,3]
输出:[1,3,2]
思路
从后往前2次扫描,第一次扫描找到倒数第一个小于后面的数的位置记为index1,第二次扫描找到index1+1到结尾最小的大于index1的数字。然后交换index1和index2的位置,给index1+1,到结尾排序
得到目标数组。
代码
class Solution:
def nextPermutation(self, nums: List[int]) -> None:
"""
Do not return anything, modify nums in-place instead.
"""
if len(nums) == 1:
return
index_1 = 0 ## 第一次从后往前遍历
Flag = False
for i in range(len(nums)-1, 0, -1):
if nums[i] > nums[i-1]:
index_1 = i - 1
Flag = True
break
if Flag == False:
return nums.sort()
Min = nums[index_1 + 1]
index_2 = index_1 + 1
for i in range(index_1 + 1,len(nums)):
if nums[i] < Min and nums[i] > nums[index_1]:
Min = nums[i]
index_2 = i
##print(index_1,nums)
tmp = nums[index_1]
nums[index_1] = nums[index_2]
nums[index_2] = tmp
##print(nums)
for i in range(index_1+1,len(nums)-1):
for j in range(i+1,len(nums)):
if nums[i] > nums[j]:
##print(i,j)
tmp = nums[i]
nums[i] = nums[j]
nums[j] = tmp
运行结果
执行用时:36 ms, 在所有 Python3 提交中击败了86.63%的用户
内存消耗:14.6 MB, 在所有 Python3 提交中击败了95.59%的用户
题目来源
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/next-permutation
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。