题目在这:https://leetcode-cn.com/problems/next-permutation/
题目分析:
这道题目描述的很奇怪,我也是看的一脸懵逼,读了N边看了评论区,
简单的解释一下题目的意思,就是给了一个列表,你要对其重新排列找到紧挨着他的比他大的数。
比如 nums = [1,2,3] , 必须通过重新排列找到 [1,3,2] 。而其他的答案 ,像是[3,2,1] [3,1,2] [2,1,3] [2,3,1] 虽然都是比原字符串大,都是都不符合答案要求,因为他们都不是紧挨着的下一个更大的数。所以下一个更大的数只能是 [1,3,2]。
思路分析:
因为我们要往大的方向找,并且要紧挨着原数的大一级的数,要先考虑低位的重新排列。所以 我们从后向前遍历。
1.找到第一个 nums[i] < nums[i+1] 的数。
2.从新从后向前遍历 找到第一个 大于nums[i]的数 nums[j]。
3.交换nums[i]和nums[j]。
4.将nums[i] 后面的数反转。
具体为什么这样操作,我也没太理解。不过手动操作了一边,这个算法确实行得通而且比较方便。
完整代码
class Solution:
def nextPermutation(self, nums: List[int]) -> None:
"""
Do not return anything, modify nums in-place instead.
"""
if len(nums) < 2:
pass
else:
for i in range(len(nums)-1,-1,-1): # 找到数字nums[i]
if i != len(nums)-1 and nums[i] < nums[i+1]:
left = i
break
if i == 0 and nums[i] == max(nums): # 判断整个字符串是否是降序
nums.sort()
else:
for j in range(len(nums)-1,-1,-1): # 找到数字nums[j]
if nums[j] > nums[i]:
right = j
break
print(left,right)
nums[left],nums[right] = nums[right],nums[left] # 交换两个数字的位置
print(nums)
nums[left+1:] = nums[:left:-1] # 反转nums[i] 后面的数字 ,即原来nums[j]后面的数字
print(nums)