题:算法需要将给定数字序列重新排列成字典序中下一个更大的排列。如果不存在下一个更大的排列,则将数字重新排列成最小的排列(即升序排列)
法:舍友说这题在面快手算法岗实习的时候考过。
其实就是从nums从后往前找,如果找到nums[i]>nums[i-1],证明在nums[i-1]这一位存在一个比较小的数,是要被替换掉的,具体用哪一位替换nums[i-1]? 再从nums[-1]开始找,找到nums[i]为止,如果有nums[j]>nums[i-1],那么就交换二者,并使nums[i]及之后的数据都再排序
如果一开始就没有nums[i]>nums[i-1],证明nums本来就是逆序排好序的,那么将数字重新排列成最小排列即可。
def nextPermutation(self, nums):
"""
:type nums: List[int]
:rtype: void Do not return anything, modify nums in-place instead.
"""
length=len(nums)
if length<=1:return
i=length-1
flag=0 #标志位,判断原nums是否正好是逆序排列
while i>=1:
if nums[i]>nums[i-1]:
flag=1
j=length-1
while j>=i:
if nums[j]>nums[i-1]:
nums[i-1],nums[j]=nums[j],nums[i-1]
break
j-=1
nums[i:]=nums[i:][::-1]
break
i-=1
if flag==0:
nums[:]=nums[::-1]