解题思路-leetcode第三十一题:下一个排列
题目描述:
实现获取下一个排列的函数,算法需要将给定数字序列重新排列成字典序中下一个更大的排列。
如果不存在下一个更大的排列,则将数字重新排列成最小的排列(即升序排列)。
必须原地修改,只允许使用额外常数空间。
以下是一些例子,输入位于左侧列,其相应输出位于右侧列。
1,2,3 → 1,3,2
3,2,1 → 1,2,3
1,1,5 → 1,5,1
解题思路:本题采用暴力解码,直接从列表最后开始遍历,当遍历到的数字num[i]大于他的前一个数字num[i-1]时,将当前位置(包含当前)以后的数字当成子列表进行升序排列,然后遍历排序后的子列表,发现第一个比num[i]大的数字num[j]时,将num[i]与num[j]元素交换,然后返回列表。若遍历到最后都未发现后一个数大于前一个数,则返回升序排列后的列表。代码如下:
class Solution:
def nextPermutation(self, nums: List[int]) -> None:
"""
Do not return anything, modify nums in-place instead.
"""
for i in range(len(nums)-1, 0, -1):
if nums[i] > nums[i-1]:
nums[i:] = sorted(nums[i:])
for j in range(i, len(nums)):
if nums[j] > nums[i-1]:
nums[j], nums[i-1] = nums[i-1], nums[j]
break
return
return nums.sort()
提交后,通过。