这道题你不来了解一下吗

栈和排序

问题描述

给你一个由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)

大家都在看

  • Linux 实用命令

    实用命令: 1、查看端口占用情况 查看该端口是&…

    技术杂谈 2023年6月21日
    0107
  • 编写一个kubernetes controller

    404. 抱歉,您访问的资源不存在。 可能是网址有误,或者对应的内容被删除,或者处于私有状态。 代码改变世界,联系邮箱 contact@cnblogs.com 园子的商业化努力-困…

    技术杂谈 2023年7月25日
    075
  • ORM操作

    增加 models.类.objects.create(name=’aa’,age=18) modes.类.object.create( **dic) obj…

    技术杂谈 2023年7月24日
    072
  • lambda表达式常用00

    交集 并集 差集 List集合的过滤之lambda表达式 lambda表达式将List对象某个字段转换以逗号分隔的String类型 Original: https://www.cn…

    技术杂谈 2023年7月24日
    078
  • []产品和成本效率总结提炼

    [原创]产品和成本效率总结提炼 1、个人的成本和效率: 对外(你的产品帮用户降低成本,提升效率)和对内(你的方法有没有更好的方案,如:天猫精灵,解决了必须要用手机控制设备) 2、组…

    技术杂谈 2023年5月30日
    0105
  • 安卓NFC读卡DEMO

    设计文档 简介 这个APP的功能是使用手机的NFC读卡器功能,做到读取卡片支持M1卡和CPU卡。 功能列表 基本功能 读卡唯一号 读卡SAK(可以判断卡类型 08 M1卡 28 复…

    技术杂谈 2023年5月31日
    091
  • chromium 编译源码里面的单一模块 测试用例

    当查看chromium源码,发现在viz下有个demo可执行源码。位于目录: src\components\viz\demo 打开此目录下的 BUILD.gn ,找到 gn 的ta…

    技术杂谈 2023年5月31日
    094
  • WCF后传系列(10):消息处理功能核心

    概述 WCF是一个通信框架,同时也可以将它看成是一个消息处理或者传递的基础框架,它可以接收消息、对消息做处理,或者根据客户端给定的数据构造消息并将消息发送到目标端点,在这个过程中,…

    技术杂谈 2023年5月31日
    084
  • 图像搜索、以图搜图测试更新版

    图像搜索、以图搜图测试更新版; Original: https://www.cnblogs.com/chenying99/p/13164491.htmlAuthor: 刺猬的温驯T…

    技术杂谈 2023年5月31日
    092
  • 2022.16 数字水印2

    安全技术包含3类:信息隐藏、访问控制和密码学。 典型的安全应用示例: 信息隐藏主要可分为隐写术和水印技术等两大类。隐写术的保护对象是隐秘消息,水印技术的保护对象是载体本身。 数字水…

    技术杂谈 2023年5月30日
    092
  • 云原生的概念

    云原生其实是一种思想,并不是一种工具,云原生更多的是一种泛化的东西,是一种思想观念,首先要有意识的去想云原生这种东西,其次,他是一种技术、流程和企业管理方法的集合,所谓的技术,k8…

    技术杂谈 2023年7月23日
    075
  • SIP穿越NAT SIP穿越防火墙-SBC

    SIP穿越NAT SIP穿越防火墙-SBC https://www.cnblogs.com/jhcelue/p/7258803.html FireWall&NATFireW…

    技术杂谈 2023年5月31日
    087
  • 发现mybatisplus#Wrapper的一个小坑

    什么坑?看如下demo代码: public void getOne() { LambdaQueryWrapper wrappers = new LambdaQueryWrapper…

    技术杂谈 2023年7月11日
    0108
  • oracle 11g RAC public/virtual/SACN/private IP we need to know

    Before starting the installation, you must have at least two interfaces configured on each…

    技术杂谈 2023年6月1日
    098
  • 硬核剖析Redis单线程为什么那么快?

    Redis目前是使用率最高的内存库数据库,是企业应用开发的必备,它极高的性能和丰富的数据结构为我们的开发提供了极大的便利。它每秒可以承受10W+的QPS,但却是单线程的处理模型,为…

    技术杂谈 2023年7月25日
    0105
  • Java注解与原理分析

    一、注解基础 二、注解原理 三、常用注解 1、JDK注解 2、Lombok注解 四、自定义注解 1、同步控制 2、类型引擎 五、参考源码 使用的太多,被忽略的理所当然; 一、注解基…

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