常州网站专业制作好看的网站模板
题目描述
原题链接: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 - 1while nums[j] <= nums[i]:j -= 1# 将该数放置到这个位置上,此时就找到了下一个排列中该位置上应有的数nums[i], nums[j] = nums[j], nums[i]# 因为右侧集合为单调递减,因此进行左右交换后一定会为单调递增l, r = i + 1, n - 1while l < r:nums[l], nums[r] = nums[r], nums[l]l += 1r -= 1
参考文章:带你发明下一个排列算法(Python/Java/C++/C/Go/JS/Rust)