本文最后更新于176 天前,其中的信息可能已经过时,如有错误请发送邮件到2446865563@qq.com
1.题目基本信息
1.1.题目描述
整数数组的一个 排列 就是将其所有成员以序列或线性顺序排列。
- 例如,arr = [1,2,3] ,以下这些都可以视作 arr 的排列:[1,2,3]、[1,3,2]、[3,1,2]、[2,3,1] 。
整数数组的 下一个排列 是指其整数的下一个字典序更大的排列。更正式地,如果数组的所有排列根据其字典顺序从小到大排列在一个容器中,那么数组的 下一个排列 就是在这个有序容器中排在它后面的那个排列。如果不存在下一个更大的排列,那么这个数组必须重排为字典序最小的排列(即,其元素按升序排列)。
-
例如,arr = [1,2,3] 的下一个排列是 [1,3,2] 。
-
类似地,arr = [2,3,1] 的下一个排列是 [3,1,2] 。
-
而 arr = [3,2,1] 的下一个排列是 [1,2,3] ,因为 [3,2,1] 不存在一个字典序更大的排列。
给你一个整数数组 nums ,找出 nums 的下一个排列。
必须 原地 修改,只允许使用额外常数空间。
1.2.题目地址
https://leetcode.cn/problems/next-permutation/description/
2.解题方法
2.1.解题思路
特殊技巧。按照下面的四步,从后面找到一个最小的比nums[i]大的元素将其进行替换,然后再让i后面的排列尽可能小,就找到了nums的下一个排列了
2.2.解题步骤
第一步,从后往前找到第一个i使nums[i]<nums[i+1]
第二步,从后往前找到第一个j是nums[j]>nums[i]
第三步,交换nums[i]和nums[j]的值
第四步,将nums[i+1:]的数组进行升序排列(由于nums[j+1:]此时是非严格递减的,所以直接翻转即可)
3.解题代码
python3代码
class Solution:
def nextPermutation(self, nums: List[int]) -> None:
"""
Do not return anything, modify nums in-place instead.
"""
# 思路:特殊技巧。按照下面的四步,从后面找到一个最小的比nums[i]大的元素将其进行替换,然后再让i后面的排列尽可能小,就找到了nums的下一个排列了
n = len(nums)
# 第一步,从后往前找到第一个i使nums[i]<nums[i+1]
i = n - 2
while i >= 0:
if nums[i] < nums[i + 1]:
break
i -= 1
# 第二步,从后往前找到第一个j是nums[j]>nums[i]
j = n - 1
while j >= 0:
if nums[j] > nums[i]:
break
j -= 1
# 第三步,交换nums[i]和nums[j]的值
if i >= 0:
nums[i], nums[j] = nums[j], nums[i]
# 第四步,将nums[i+1:]的数组进行升序排列(由于nums[j+1:]此时是非严格递减的,所以直接翻转即可)
l, r = i + 1, n - 1
while l < r:
nums[l], nums[r] = nums[r], nums[l]
l += 1
r -= 1
4.执行结果










