31. 下一个排列
https://leetcode-cn.com/problems/next-permutation/
解法一:
从后往前找降序(非严格,>=)的起点,记为i。此时[i+1,n-1]
是降序(非严格),从n-1往回找第一个大于i的数j,将i,j的数交换。再将[i+1,n-1]
区间逆序即可。
问题在于列表的下标逆序操作nums = nums[::-1]
好像原地操作不管用,在pycharm上是管用的,这里用reverse方法代替
class Solution:
def nextPermutation(self, nums: List[int]) -> None:
"""
Do not return anything, modify nums in-place instead.
"""
n = len(nums)
if n <= 2:
nums.reverse() #长度小于等于2时,直接逆序
else:
i = n-2
while i >= 0 and nums[i] >= nums[i+1]: #找降序起点
i -= 1
if i == -1: #整段都是降序,则整段逆序
nums.reverse()
else:
for j in range(n-1, i, -1): #找比nums[i]大的最小数交换
if nums[j] > nums[i]:
nums[i], nums[j] = nums[j], nums[i]
break
nums[i+1:] = nums[n-1:i:-1] #[i+1,n-1]部分逆序
最后更新于