Leetcode - 31. 下一个排列
实现获取
下一个排列的函数,算法需要将给定数字序列重新排列成字典序中下一个更大的排列(即,组合出下一个更大的整数)。
如果不存在下一个更大的排列,则将数字重新排列成最小的排列(即升序排列)。
必须原地修改,只允许使用额外常数空间。
示例 1:
输入:nums = [1,2,3]
输出:[1,3,2]
示例 2:
输入:nums = [3,2,1]
输出:[1,2,3]
示例 3:
输入:nums = [1,1,5]
输出:[1,5,1]
示例 4:
输入:nums = [1]
输出:[1]
提示:
- 1 <= nums.length <= 100
- 0 <= nums[i] <= 100
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/next-permutation
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
解1 2021/8/31 O(logn)
def nextPermutation(nums: list) -> None:
"""
Do not return anything, modify nums in-place instead.
"""
# 不能用permutation,太耗时,而且空间是O(n^2)
# 1,54,3,7,11,1,1,3,9,20,5
# 下一个:
# 1,54,3,7,11,1,1,3,20,5,9
# 1,54,3,7,11,1,1,3,9,20,11,5
# 下一个:
# 1,54,3,7,11,1,1,3,11,5,9,20
# 思路,从倒数第二个开始找,
# 1)如果是倒序的,继续往前走
# 2)如果不是倒序的,从后面找到比当前数大一点的数(大的数中最小的那个),交换一下值
# 3)后面的做升序
# 4)如果整个都是倒序的,整个做升序
len=nums.__len__()
if len==1: return
# 升序
sx=sorted(nums)
# 降序
jx=sorted(nums,key=lambda x:-x)
if jx==nums:
### 错误 - 1
# 整个赋值,只是引用,里面打出来是对的,但外面打出来不对,这里id(nums)=id(sx)
# 如果只是nums[idx:]=[xxx],是赋值,id(nums)没有变,所以内外打出来是一致的
#nums=sx
nums.sort()
### 错误 - 1
return
idx=len-2
while idx>=0:
tmp=nums[idx:]
jx=sorted(tmp,key=lambda x:-x)
if tmp==jx:
idx-=1
continue
i=1
while i<tmp.__len__() and tmp[i]>tmp[0]: i+=1
nums[idx]=tmp[0]+tmp[i-1]
nums[idx+i-1]=nums[idx]-nums[idx+i-1]
nums[idx]=nums[idx]-nums[idx+i-1]
nums[idx+1:]=sorted(nums[idx+1:])
return
if __name__ == '__main__':
'''
nums=[1,54,3,7,11,1,1,3,9,20,5]
nextPermutation(nums);print(nums)
nums=[1,2,3]
nextPermutation(nums);print(nums)
'''
'''
nums=[1,1,5]
nextPermutation(nums);print(nums)
nums=[1]
nextPermutation(nums);print(nums)
nums=[1,1,1,1,2,11]
nextPermutation(nums);print(nums)
nums=[1,54,3,7,11,1,1,3,9,20,11,9,9,5]
nextPermutation(nums);print(nums)
nums=[1,54]
nextPermutation(nums);print(nums)
nums=[1,1]
nextPermutation(nums);print(nums)
'''
### 错误
# 1
nums=[3,2,1]
nextPermutation(nums);print(nums)


浙公网安备 33010602011771号