• 下一个排列——这玩意考察的是单调栈


    52 · 下一个排列

    给定一个整数数组来表示排列,按升序找出其下一个排列。

    排列中可能包含重复的整数

    样例

    样例 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
    
  • 相关阅读:
    关于C++类中的静态数据成员
    关于C++中char,sizeof,strlen,string
    C++学习笔记(7)
    C++学习笔记(6)
    C++学习笔记(指针)
    C++学习笔记(4)
    UVA 10780
    UVA 531
    HDU, 3579 Hello Kiki
    UVA, 10413 Crazy Savages
  • 原文地址:https://www.cnblogs.com/bonelee/p/16357798.html
Copyright © 2020-2023  润新知