这道题你不来了解一下吗

2021年11月26日 阅读数:2
这篇文章主要向大家介绍这道题你不来了解一下吗,主要内容包括基础应用、实用技巧、原理机制等方面,希望对大家有所帮助。

栈和排序

问题描述

给你一个由1~n,n个数字组成的一个排列和一个栈,要求按照排列的顺序入栈。如何在不打乱入栈顺序的状况下,仅利用入栈和出栈两种操做,输出字典序最大的出栈序列。算法

排列:指 1 到 n 每一个数字出现且仅出现一次。数组

示例:app

输入:[2,1,5,3,4]code

输出:[5,4,3,1,2]排序

分析问题

因为咱们只能使用出栈和入栈两种操做,要想使得出栈序列字典序最大,首先想到的就是令高位尽量地大,咱们出栈的时机就是:当前入栈元素如果大于以后将要入栈的元素,那么就将其出栈。当元素出栈后,还须要判断栈顶元素与以后将要入栈元素之间的大小关系,若是此时栈顶元素大于以后将要入栈的元素,那么就将其出栈,不断判断直到栈为空或条件不知足。io

为了快速判断“当前入栈元素是否大于以后将要入栈的元素”,咱们须要建立一个辅助数组temp,其中temp[i]表示i以后的最大元素。借助辅助数组,咱们能够以O(1)的时间复杂度去判断当前入栈元素是否大于以后将要入栈的元素。class

image-20211109214153107

image-20211109215553532

image-20211109215610927

image-20211109215644288

image-20211109215700561

image-20211109215716016

image-20211109215736573

image-20211109215756969

image-20211109215816076

下面咱们来看一下代码的实现。import

import sys
class Solution:
    def solve(self , a):
        n=len(a)
        res=[]
        if n==0:
            return res
        stack=[]
        temp=[0]*n
        temp[n-1]=-sys.maxsize-1
        #从右往左遍历数组a,而后取填充temp
        #使得temp[i]表示i以后的最大元素
        for i in range(n-2,-1,-1):
            temp[i]=max(a[i+1],temp[i+1])

        #遍历数组a
        for i in range(0,n):
            if a[i] > temp[i]:  #若当前元素大于以后将要入栈的元素,将其加入结果中
                res.append(a[i])
                # 若栈不为空,且栈顶元素大于temp[i],
                # 栈顶出栈,加入结果中
                while stack and stack[-1] > temp[i]:
                    res.append(stack[-1])
                    stack.pop()
            else:
                stack.append(a[i])

        while stack:
            res.append(stack[-1])
            stack.pop()
        return res

该算法的时间复杂度是O(n),空间复杂度也是O(n)。遍历