*31. Next Permutation

1. 原始题目

实现获取下一个排列的函数,算法需要将给定数字序列重新排列成字典序中下一个更大的排列。

如果不存在下一个更大的排列,则将数字重新排列成最小的排列(即升序排列)。

必须原地修改,只允许使用额外常数空间。

以下是一些例子,输入位于左侧列,其相应输出位于右侧列。
1,2,3 → 1,3,2
3,2,1 → 1,2,3
1,1,5 → 1,5,1

2. 思路

首先逆序找到第一个减小的数:例如:1,2,3,4,5,6,4,8,5,3,2   。  则逆序第一个减小的数为4. 此时4<8. 那么4应该直接和8替换吗?这里容易直接误会有4和8做替换。事实上,4之后所有的数都为递减,我们应该找到5来做替换。之后为了实现最小排列,还应将替换后的5之后的所有元素做递增排列:

3. 解题

 1 class Solution:
 2     def nextPermutation(self, nums) -> None:
 3         """
 4         Do not return anything, modify nums in-place instead.
 5         """
 6 
 7         if len(nums)>1:
 8             i=len(nums)-2
 9             while(i>=0):
10                 if (nums[i+1]>nums[i]): 
11                     break
12                 i-=1      # 找复合要求的元素
13             14             if i==-1 :    # 说明没有找到符合要求的元素,即该序列是递减序列,那我直接反转  
15                 nums = sorted(nums)
16             else:    
17                j=len(nums)-1
18                while(j>=0 and nums[i]>=nums[j]):
19                     j-=1
20                nums[i],nums[j] = nums[j],nums[i]       # 找到符合要求的元素,做交换
21                nums[i+1:] = sorted(nums[i+1:])      # 反转 或 排序
22         return nums

猜你喜欢

转载自www.cnblogs.com/king-lps/p/10738753.html