zoukankan      html  css  js  c++  java
  • *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
  • 相关阅读:
    学习进度条--第十四周
    第二次团队冲刺--9
    第二次团队冲刺--8
    课堂练习--最少花费的购买书籍
    第二次团队冲刺--7
    第二次团队冲刺--6
    第二次团队冲刺--5
    软工第四周进度表
    软工第四周过程总结
    个人作业之二柱子四则运算2升级版
  • 原文地址:https://www.cnblogs.com/king-lps/p/10738753.html
Copyright © 2011-2022 走看看