214、【数组】下一个排列(Python)
题目描述
原题链接:31. 下一个排列
思路
从后往前,找到第一个小于右侧集合的数,从右侧集合中找到一个比该数大的最小的数替换上去。
然后,将右侧集合从小到排列,就为当前排列中,下一个排列的数。
代码实现
class Solution:
def nextPermutation(self, nums: List[int]) -> None:
"""
Do not return anything, modify nums in-place instead.
"""
n = len(nums)
# 1、从倒数第二个数从右向左遍历
i = n - 2
# 找到第一个小于右侧集合的数
while i >=0 and nums[i] >= nums[i + 1]: # 此时右侧集合一定为单调递减
i -= 1
# 当该排列不是全为单调递减时
if i >= 0:
# 找到右侧集合中,比nums[i]的大最小的数
j = n - 1
while nums[j] <= nums[i]:
j -= 1
# 将该数放置到这个位置上,此时就找到了下一个排列中该位置上应有的数
nums[i], nums[j] = nums[j], nums[i]
# 因为右侧集合为单调递减,因此进行左右交换后一定会为单调递增
l, r = i + 1, n - 1
while l < r:
nums[l], nums[r] = nums[r], nums[l]
l += 1
r -= 1
参考文章:带你发明下一个排列算法(Python/Java/C++/C/Go/JS/Rust)