1441. 用栈操作构建数组:简单模拟+栈思想

简介: 这是 力扣上的 1441. 用栈操作构建数组,难度为 中等。

题目描述

这是 力扣上的 1441. 用栈操作构建数组,难度为 中等

image.png

题目分析

根据题意咱们需要去用栈的方式来处理这个题,题目给出的 target 是我们需要模拟的结果,给出的 n 实际上是对应这一个 1-n 的列表,并且此处说明 target 一定是单调递增的

因此,咱们来实现这个题,仅需要按照题目来进行模拟即可

栈的思想是先进后出 FIFO,那么每个数字(来源于 1-n) 都需要遵循这个规定

那么我们就可以直接来来遍历我们的目标 target ,来根据 target 中遍历出来的每一个元素进行判断, 同时需要记录一下 1-n 的列表我们遍历到哪里了

遍历 target 的时候,我们判断当前元素,和 1-n 中的对应数字是否有偏差

  • 如果没有偏差, 那么就直接将 1-n 中的这个数字进行 “Push” 即可,当然实际的操作是将 “Push” 字符串加入到结果集
  • 如果是有偏差的,那么说明是 target 中的当前元素(例如记为 A)是大于 1-n 列表中对应的元素(例如记为 B),那么就要将 B 到 A 中的每一个数字进行 “Push“ 再 “Pop” 放到结果集中 , 最终直到 A == B ,此时再将 B “Push” 到结果集中

经过模拟之后,咱们得到的结果集,即为我们期望的操作栈的顺序

过程可以看如下简图:例如 target = [1,3], n = 3

image.png

相信通过这个简图,我们就可以知道上述阐述的 2 种情况了吧,一个是正常入栈,一个是先入栈再出栈,一定要注意本题,本题能实现的前提是,给出的 target 一定是单点递增的

如果用在实际工作生活中这是不可取的,因为不够健壮,实际工作中会有很多坑以及异常情况,都是要注意处理的,简单先说到这里

接下来,咱们就可以来实现编码了,咱们这次使用 golang 的方式来进行实现

Golang 的实现方式:

func buildArray(target []int, n int) []string {
    // 简单模拟
    help := 0
    ans := []string{}
    for _, num := range target {
        for i:=0; i<num-help-1;i++{
            ans = append(ans, "Push", "Pop")
        }
        ans = append(ans, "Push")
        help = num
    }
    return ans
}

这种实现方式,咱们的时间复杂度是 O(n),此处的 n 是 target 的长度,空间复杂度也是 O(n),那就是咱们的 ans

今天就到这里,若有偏差,还请斧正

欢迎点赞,关注,收藏

朋友们,你的支持和鼓励,是我坚持分享,提高质量的动力

image.png

好了,本次就到这里

技术是开放的,我们的心态,更应是开放的。拥抱变化,向阳而生,努力向前行。

我是阿兵云原生,欢迎点赞关注收藏,下次见~



相关文章
|
3天前
|
存储
栈与队列练习题
栈与队列练习题
|
3天前
|
存储 索引
操作数栈的字节码指令执行分析
操作数栈的字节码指令执行分析
|
3天前
|
算法 C++
D1. Range Sorting (Easy Version)(单调栈+思维)
D1. Range Sorting (Easy Version)(单调栈+思维)
|
3天前
|
人工智能
线段树最大连续子段板子😂单调栈
线段树最大连续子段板子😂单调栈
|
3天前
数据结构第四课 -----线性表之栈
数据结构第四课 -----线性表之栈
|
4天前
|
存储
栈数据结构详解
栈(stack)是一种线性数据结构,栈中的元素只能先入后出(First In Last Out,简称FILO)。最早进入的元素存放的位置叫作栈底(bottom),最后进入的元素存放的位置叫作栈顶 (top)。本文是对堆结构的通透介绍
|
4天前
|
存储 Java
数据结构奇妙旅程之栈和队列
数据结构奇妙旅程之栈和队列
|
7天前
|
存储 JavaScript 前端开发
什么是堆?什么是栈?他们之间从区别和联系
什么是堆?什么是栈?他们之间从区别和联系
23 0
|
25天前
|
消息中间件 存储 搜索推荐
深入理解栈和队列(二):队列
深入理解栈和队列(二):队列
37 0
|
5天前
|
算法
栈刷题记(二-用栈操作构建数组)
栈刷题记(二-用栈操作构建数组)