给定一个整数数组来表示排列,按升序找出其下一个排列。
排列中可能包含重复的整数
样例
样例 1:
输入:
数组 = [1]
输出:
[1]
解释:
只有一个整数,下一个排列是自己。
样例 2:
输入:
数组 = [1,3,2,3]
输出:
[1,3,3,2]
解释:
[1,3,2,3]的下一个排列是[1,3,3,2]。
样例 3:
输入:
数组 = [4,3,2,1]
输出:
[1,2,3,4]
解释:
没有字典序更大的排列时,输出字典序最小的排列。
from typing import ( List, ) class Solution: """ @param nums: A list of integers @return: A list of integers """ def next_permutation(self, nums: List[int]) -> List[int]: # write your code here # 123213 4510 ==> 123213 5014 # 123213 476410 ==> 123213 601447 # 考察单调栈,三步: # 1、从后向前升序,找到第一个降序数字,对于123213 476410则找到4是第一个降序数字 # 2、然后找到升序里第一个大于它的数字,就是6了! # 3、然后交换4和6,则变成123213 674410,最后将74410反转下排序就是123213 601447 if not nums or len(nums) == 1: return nums i = len(nums) - 2 stack = [len(nums)-1] while i >= 0 and stack and nums[stack[-1]] <= nums[i]: stack.append(i) i -= 1 if i < 0: return nums[::-1] # assert nums[i] < stack[-1] pos1 = pos2 = i while stack and nums[stack[-1]] > nums[i]: pos2 = stack.pop() nums[pos1], nums[pos2] = nums[pos2], nums[pos1] i, j = pos1+1, len(nums)-1 while i < j: nums[i], nums[j] = nums[j], nums[i] i += 1 j -= 1 return nums