0
点赞
收藏
分享

微信扫一扫

【LeetCode】31. 下一个排列


0. 总结

  • 本题我用了35min,有些浪费时间了。理想时间15min差不多,我主要是在​​reversed(range(len(nums)))​​这里不熟练
  • 可以直接用​​.sort()​​属性对一个数组进行原地排序。

1. 题意

求出当前排列的下一个排列

题目​​链接​​

2. 思想

当然这题是不需要全排列然后挨个查找的,那样的话是不是太慢了?所以应该考虑如何找到当前排列的下一个排列?

2.1 观察数据

以​​【1,2,4,3】​​​为例,可以看到其下一组是​​【1,3,2,4】​

  • 【3】 单独的一个数,已经是最大的排序了,不可能再有更改了
  • 【4,3】 数字4右侧的数都比4小,当前已经是最大的排序了,不可能再有更改了,所以需要再往左边看一位。
  • 【2,4,3】 发现数字2的右侧有比2大的数,那么当前这个排序就不是最大排序,所以还有得排。我们从2 的右侧挑一个最小的值(3)出来,放在2所在的位置,然后将剩余的【2,4】 做一个升序排序,那么得到的结果就是 【3,2,4】。同之前的1 拼接到一起,那么结果就是【1,3,2,4】

3. 代码

根据上述思想+判断一下特殊用例,就很容易得到如下代码:

from typing import List
class Solution:
def nextPermutation(self, nums: List[int]) -> None:
"""
Do not return anything, modify nums in-place instead.
"""
remain = [] # 用于保存后面需要排序的数
temp = 999999
# 从后往前找到一个第一个满足条件的数
for i in reversed(range(len(nums))): # i=2,i = 1
for j in reversed(range(i+1,len(nums))): #
if nums[j] > nums[i]: # 满足条件
temp = min(nums[j],temp) # 找出右侧最小值

if temp!=999999:
# 将后面的数全放到remain中
for k in range(i,len(nums)):
remain.append(nums[k])
remain.remove(temp) # 删除掉temp
break
if temp == 999999: # 说明一个都没找到
nums.sort()
return nums

remain.sort() # 排序
nums[i] = temp
nums[i+1::] = remain
return nums
s = Solution()
# nums = [1,1,5]
# nums = [2,3,1]
# nums = [4,3,2,1]
nums = [1,4,3,5,4]
nums = [1,2,4,5]
s.nextPermutation(nums)



举报

相关推荐

0 条评论