901. 股票价格跨度:单调栈

简介: 这是 力扣上的 901. 股票价格跨度,难度为 中等。

题目描述

这是 力扣上的 901. 股票价格跨度,难度为 中等

image.png

题目分析

简单来说,题目要求我们设计一个StockSpannerStockSpannerStockSpanner 对象,来达到输入一个股票价格,就能够立刻得到当日股票的价格跨度

此处输入的价格是按照天数依次输入的,计算的时候咱们需要往前开大于等于当前天的价格,包含当前天

思考:

根据题目给出的要求和示例,我们简单模拟一下可以知道,对于每一个 price,我们总会去向前找第一个大于他的价格,然后计算中间的跨度

有没有觉得这个场景非常的熟悉,那就是类似于找到下一个更大的数,这种体型,其实我们就可以使用单调栈就可以很好的解决这类问题了


如何去设计呢?

首先我们可以使用切片来模拟栈空间,将题目给出的股票天数和价格给打包在一起,例如索引为 -1,对应的价格是一个很大的数,放到栈空间中,且咱们为了防止栈为空的情况,我们就可以向栈空间中补充一个初始化的基准值,例如−1,math.MaxInt32{-1, math.MaxInt32}1math.MaxInt32

可以再设计一个indexindexindex作为对象中当前输入的 pricepriceprice 对应的索引,那么就有这样的结构

type StockSpanner struct {
    stack [][2]int
    index int
}

那么接下来就是来实现 next 方法的时候,咱们直接运用单调栈的思想:

栈中已经初始化好,并放入了−1,math.MaxInt32{-1, math.MaxInt32}1math.MaxInt32,这个时候,当给 next 方法传入新的pricepriceprice的时候,我们就可以比较pricepriceprice是否大于栈顶的值,若是,则弹出栈顶,直到栈顶的值大于price priceprice

此时,我们再将 pricepriceprice 和其对应的indexindexindex入栈

最后我们计算当前栈顶与栈顶前一个数的索引跨度即可,这样就可以很轻易的找到 当前pricepriceprice往前的第一个大于等于price priceprice 的数了

例如题目中给出来的实例:

image.png

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

Golang 的实现方式:

  • 初始化栈,并压入基本值
  • 实现单调栈的思想即可
type StockSpanner struct {
    stack [][2]int
    index int
}
func Constructor() StockSpanner {
    // 初始化对象,默认栈里面先放一个最大的数,表示,天数为 对应的索引为 -1,对应的 price 是一个最大书
    // index 表示当前数据的索引
    return StockSpanner{[][2]int{{-1, math.MaxInt32}} ,-1}
}
func (this *StockSpanner) Next(price int) int {
    this.index++
    // price 大于等于栈顶的时候,弹出栈顶,直到栈顶的值小于 price
    for price >= this.stack[len(this.stack)-1][1]{
        this.stack = this.stack[:len(this.stack)-1]
    }
    // price 入栈
    this.stack = append(this.stack, [2]int{this.index, price})
    // 此时 price 是栈顶,我们取 栈顶和栈顶前一个数的索引差值即可
    return this.index - this.stack[len(this.stack)-2][0]
}
/**
 * Your StockSpanner object will be instantiated and called as such:
 * obj := Constructor();
 * param_1 := obj.Next(price);
 */

这种实现方式,咱们的时间复杂度为 O(n) ,其中 n 是 next 步骤的次数, 根据我们的实现方式,每一个股票价格在栈里面,最多的情况是进去一次,出来一次

空间复杂度是 O(n),咱们开辟了的栈空间来模拟

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

欢迎点赞,关注,收藏

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

image.png

好了,本次就到这里

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

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



相关文章
|
3月前
|
编译器 C语言 C++
栈区的非法访问导致的死循环(x64)
这段内容主要分析了一段C语言代码在VS2022中形成死循环的原因,涉及栈区内存布局和数组越界问题。代码中`arr[15]`越界访问,修改了变量`i`的值,导致`for`循环条件始终为真,形成死循环。原因是VS2022栈区从低地址到高地址分配内存,`arr`数组与`i`相邻,`arr[15]`恰好覆盖`i`的地址。而在VS2019中,栈区先分配高地址再分配低地址,因此相同代码表现不同。这说明编译器对栈区内存分配顺序的实现差异会导致程序行为不一致,需避免数组越界以确保代码健壮性。
42 0
栈区的非法访问导致的死循环(x64)
232.用栈实现队列,225. 用队列实现栈
在232题中,通过两个栈(`stIn`和`stOut`)模拟队列的先入先出(FIFO)行为。`push`操作将元素压入`stIn`,`pop`和`peek`操作则通过将`stIn`的元素转移到`stOut`来实现队列的顺序访问。 225题则是利用单个队列(`que`)模拟栈的后入先出(LIFO)特性。通过多次调整队列头部元素的位置,确保弹出顺序符合栈的要求。`top`操作直接返回队列尾部元素,`empty`判断队列是否为空。 两题均仅使用基础数据结构操作,展示了栈与队列之间的转换逻辑。
|
8月前
|
存储 C语言 C++
【C++数据结构——栈与队列】顺序栈的基本运算(头歌实践教学平台习题)【合集】
本关任务:编写一个程序实现顺序栈的基本运算。开始你的任务吧,祝你成功!​ 相关知识 初始化栈 销毁栈 判断栈是否为空 进栈 出栈 取栈顶元素 1.初始化栈 概念:初始化栈是为栈的使用做准备,包括分配内存空间(如果是动态分配)和设置栈的初始状态。栈有顺序栈和链式栈两种常见形式。对于顺序栈,通常需要定义一个数组来存储栈元素,并设置一个变量来记录栈顶位置;对于链式栈,需要定义节点结构,包含数据域和指针域,同时初始化栈顶指针。 示例(顺序栈): 以下是一个简单的顺序栈初始化示例,假设用C语言实现,栈中存储
329 77
|
7月前
|
算法 调度 C++
STL——栈和队列和优先队列
通过以上对栈、队列和优先队列的详细解释和示例,希望能帮助读者更好地理解和应用这些重要的数据结构。
149 11
|
7月前
|
DataX
☀☀☀☀☀☀☀有关栈和队列应用的oj题讲解☼☼☼☼☼☼☼
### 简介 本文介绍了三种数据结构的实现方法:用两个队列实现栈、用两个栈实现队列以及设计循环队列。具体思路如下: 1. **用两个队列实现栈**: - 插入元素时,选择非空队列进行插入。 - 移除栈顶元素时,将非空队列中的元素依次转移到另一个队列,直到只剩下一个元素,然后弹出该元素。 - 判空条件为两个队列均为空。 2. **用两个栈实现队列**: - 插入元素时,选择非空栈进行插入。 - 移除队首元素时,将非空栈中的元素依次转移到另一个栈,再将这些元素重新放回原栈以保持顺序。 - 判空条件为两个栈均为空。
|
8月前
|
存储 C++ 索引
【C++数据结构——栈与队列】环形队列的基本运算(头歌实践教学平台习题)【合集】
【数据结构——栈与队列】环形队列的基本运算(头歌实践教学平台习题)【合集】初始化队列、销毁队列、判断队列是否为空、进队列、出队列等。本关任务:编写一个程序实现环形队列的基本运算。(6)出队列序列:yzopq2*(5)依次进队列元素:opq2*(6)出队列序列:bcdef。(2)依次进队列元素:abc。(5)依次进队列元素:def。(2)依次进队列元素:xyz。开始你的任务吧,祝你成功!(4)出队一个元素a。(4)出队一个元素x。
236 13
【C++数据结构——栈与队列】环形队列的基本运算(头歌实践教学平台习题)【合集】
|
8月前
|
存储 C语言 C++
【C++数据结构——栈与队列】链栈的基本运算(头歌实践教学平台习题)【合集】
本关任务:编写一个程序实现链栈的基本运算。开始你的任务吧,祝你成功!​ 相关知识 初始化栈 销毁栈 判断栈是否为空 进栈 出栈 取栈顶元素 初始化栈 概念:初始化栈是为栈的使用做准备,包括分配内存空间(如果是动态分配)和设置栈的初始状态。栈有顺序栈和链式栈两种常见形式。对于顺序栈,通常需要定义一个数组来存储栈元素,并设置一个变量来记录栈顶位置;对于链式栈,需要定义节点结构,包含数据域和指针域,同时初始化栈顶指针。 示例(顺序栈): 以下是一个简单的顺序栈初始化示例,假设用C语言实现,栈中存储整数,最大
130 9
|
8月前
|
C++
【C++数据结构——栈和队列】括号配对(头歌实践教学平台习题)【合集】
【数据结构——栈和队列】括号配对(头歌实践教学平台习题)【合集】(1)遇到左括号:进栈Push()(2)遇到右括号:若栈顶元素为左括号,则出栈Pop();否则返回false。(3)当遍历表达式结束,且栈为空时,则返回true,否则返回false。本关任务:编写一个程序利用栈判断左、右圆括号是否配对。为了完成本关任务,你需要掌握:栈对括号的处理。(1)遇到左括号:进栈Push()开始你的任务吧,祝你成功!测试输入:(()))
182 7
|
10月前
|
存储 缓存 算法
在C语言中,数据结构是构建高效程序的基石。本文探讨了数组、链表、栈、队列、树和图等常见数据结构的特点、应用及实现方式
在C语言中,数据结构是构建高效程序的基石。本文探讨了数组、链表、栈、队列、树和图等常见数据结构的特点、应用及实现方式,强调了合理选择数据结构的重要性,并通过案例分析展示了其在实际项目中的应用,旨在帮助读者提升编程能力。
262 5
|
10月前
|
算法
数据结构之购物车系统(链表和栈)
本文介绍了基于链表和栈的购物车系统的设计与实现。该系统通过命令行界面提供商品管理、购物车查看、结算等功能,支持用户便捷地管理购物清单。核心代码定义了商品、购物车商品节点和购物车的数据结构,并实现了添加、删除商品、查看购物车内容及结算等操作。算法分析显示,系统在处理小规模购物车时表现良好,但在大规模购物车操作下可能存在性能瓶颈。
226 0