这道题你不来了解一下吗

栈和排序

问题描述

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

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

示例:

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

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

分析问题

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

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

这道题你不来了解一下吗

这道题你不来了解一下吗

这道题你不来了解一下吗

这道题你不来了解一下吗

这道题你不来了解一下吗

这道题你不来了解一下吗

这道题你不来了解一下吗

这道题你不来了解一下吗

这道题你不来了解一下吗

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

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)。

Original: https://www.cnblogs.com/cxyxz/p/15541772.html
Author: 算法推荐管
Title: 这道题你不来了解一下吗

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/715319/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • Java8 函数式【1】:一文读懂逆变

    Java8 函数式【1】:一文读懂逆变 禁止转载 pure function 协变 逆变 Java8 引入了函数式接口,从此方法传参可以传递函数了,有人说:不就是传一个方法吗,语法…

    技术杂谈 2023年7月24日
    078
  • 【cartographer_ros】五:发布和订阅陀螺仪Imu信息

    上一节介绍了里程计Odometry传感数据的订阅和发布。 本节会介绍陀螺仪Imu数据的发布和订阅。陀螺仪在cartographer中主要用于前端位置预估和后端优化。 在终端查看消息…

    技术杂谈 2023年7月24日
    088
  • 常用正则表达式

    1.提取字符串中所有数字字符 1 // convert text to int ignoring all non-numerical characters 2 public str…

    技术杂谈 2023年7月23日
    082
  • Spring实战入门,带你轻松掌握Spring框架

    Spring 是于 2003 年兴起的一个轻量级的 Java 开发框架,它是为了解决企业应用开发的复杂性而创建的。Spring 的核心是控制反转(IoC)和面向切面编程(AOP)。…

    技术杂谈 2023年7月25日
    087
  • Qt Creator pro文件常见配置

    HEADERS:指定项目的头文件(.h) SOURCES:指定项目的源文件(.cpp) FORMS:指定协议UIC处理的由Qt Designer生成的.ui文件 RESOURCES…

    技术杂谈 2023年7月11日
    0100
  • 运算符(1)

    算数运算符 在Java中,使用算术运算符+、-、*、/表示加、减、乘、除运算。当参与/运算的两个操作数都是整数时,表示整数除法运算;否则,表示浮点除法。整数的求余操作(取模)用%表…

    技术杂谈 2023年7月11日
    064
  • 关于sparksql调优的一些操作

    1、查看执行计划1、直接sql查看: explain select … from … 2、ds.explain()2、执行计划的处理流程sql代码 -&gt…

    技术杂谈 2023年7月25日
    089
  • Go学习第二天:查看变量的类型

    方法一: %T 格式化输出%T。详情见这个例子: import "fmt" func main(){ var a = 1 fmt.Printf( "a…

    技术杂谈 2023年7月24日
    087
  • 嵌入式软件架构设计-函数调用

    1 前言 函数调用很好理解,即使刚学没多久的朋友也知道函数调用是怎么实现的,即调用一个已经封装好的函数,实现某个特定的功能。 把一个或者多个功能通过函数的方式封装起来,对外只提供一…

    技术杂谈 2023年7月25日
    063
  • linux多线程-使用mmap映射实现文件拷贝

    一、代码实现思路 1、示意图 2、示意图注解 循环创建i个线程,将src文件分为i段拷贝到dest文件中 (1)src文件的大小为src_size,前i-1个线程拷贝的文件大小为s…

    技术杂谈 2023年7月11日
    063
  • MySQL数据库-数据表(二)

    分析:给 reader 表添加数据. INSERT INTO:插入数据,插入数据的时候会检查主键或者唯一索引,如果出现重复就会报错; 语法:INSERT INTO table_na…

    技术杂谈 2023年6月21日
    099
  • python 对潜在客户数据集 进行数据分析

    大家好,我是小寒。 今天给大家带来一篇 探索性数据分析(EDA) 案例分享。如果觉得不错,可以多多分享。 什么是探索性数据分析 探索性数据分析 (EDA) 是任何数据科学或数据分析…

    技术杂谈 2023年7月25日
    081
  • Golang:将日志以Json格式输出到Kafka

    工程实践中,我们往往还需要对日志进行采集,将日志归集到一起,然后用于各种处理分析,比如生产环境上的错误分析、异常告警等等。在日志消息系统领域,Kafka久负盛名,这篇文章就以将日志…

    技术杂谈 2023年7月11日
    091
  • FastJSON 后端返回Long型 前段精度丢失的问题

    解决方法就是将Long型转换为字符串—全局配置方案如下: @Override public void configureMessageConverters(List&g…

    技术杂谈 2023年5月30日
    084
  • 交叉编译rust-openssl crate

    转自:https://www.javaroad.cn/questions/121768 我在Debian机器上,我想为我的Raspberry Pi 2交叉编译一个项目 . 我已经设…

    技术杂谈 2023年6月1日
    0115
  • 多任务学习-Multitask Learning概述zz

    1、单任务学习VS多任务学习 单任务学习:一次只学习一个任务(task),大部分的机器学习任务都属于单任务学习。 多任务学习:把多个相关(related)的任务放在一起学习,同时学…

    技术杂谈 2023年5月31日
    093
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球