题目:
原题链接: https://leetcode-cn.com/problems/next-permutation/
解题思路:
这道题的意思,是将数组中的元素,认为是一个数字,只是将每一位都单独拆了出来
使用已有的数字,组成一个比当前数字大的数字中,最小的一个
如果没有,就返回能够组成的最小数字
查找的逻辑如下:
从后往前遍历,假设当前遍历元素的下标为idx,遍历时规则如下:
- 如果 [idx] <= [idx - 1],继续向前遍历
- 如果 [idx] > [idx - 1],记录idx - 1的值,对idx开始的元素排序,并找到后续元素中,比[idx - 1]大的最小一个值,与[idx - 1]的值进行交换(排序和交换值的顺序不影响结果)
借用leetcode题解中的动图示例如下:
代码实现:
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]:
tmp_nums = nums[i:]
tmp_nums.sort()
nums[i:] = tmp_nums
for j in range(i, len(nums)):
if nums[j] > nums[i - 1]:
nums[i - 1], nums[j] = nums[j], nums[i - 1]
break
return
nums.sort()