题目:

编写一个 StockSpanner 类,它收集某些股票的每日报价,并返回该股票当日价格的跨度。

今天股票价格的跨度被定义为股票价格小于或等于今天价格的最大连续日数(从今天开始往回数,包括今天)。

例如,如果未来7天股票的价格是 [100, 80, 60, 70, 60, 75, 85],那么股票跨度将是 [1, 1, 1, 2, 1, 4, 6]。

示例:

输入:["StockSpanner","next","next","next","next","next","next","next"], [[],[100],[80],[60],[70],[60],[75],[85]]
输出:[null,1,1,1,2,1,4,6]
解释:
首先,初始化 S = StockSpanner(),然后:
S.next(100) 被调用并返回 1,
S.next(80) 被调用并返回 1,
S.next(60) 被调用并返回 1,
S.next(70) 被调用并返回 2,
S.next(60) 被调用并返回 1,
S.next(75) 被调用并返回 4,
S.next(85) 被调用并返回 6。

注意 (例如) S.next(75) 返回 4,因为截至今天的最后 4 个价格
(包括今天的价格 75) 小于或等于今天的价格。

提示:

调用 StockSpanner.next(int price) 时,将有 1 <= price <= 10^5。
每个测试用例最多可以调用  10000 次 StockSpanner.next。
在所有测试用例中,最多调用 150000 次 StockSpanner.next。
此问题的总时间限制减少了 50%。

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/online-stock-span
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

解题思路:

这是今天的每日一题,我不会做,害,看了题解区各位大佬的题解,这里记录一下~

单调栈:

题目的意思可以转换为,对于当日的价格,从这个价格开始往前查找,找到第一个比这个价格高的价格,这两个价格的下标差就是当日价格的跨度。

利用单调栈维护一个从栈底到栈顶单调递减的栈,栈中每个元素存放的是[price, count],price表示价格,count表示跨度。每次调用到next(price)时,就会比较当前price与栈顶的price,如果栈顶价格小于等于当前价格,则将栈顶的跨度加上当前价格的跨度,然后将栈顶元素出栈,直到栈顶价格大于当前价格或者栈为空。

图解来自@【Lemon】

java代码:

 1 class StockSpanner {
2 Deque<int[]> stack = new ArrayDeque<>();
3
4 public StockSpanner() {
5
6 }
7
8 public int next(int price) {
9 int count = 1;
10 while(!stack.isEmpty() && stack.peek()[0] <= price){
11 count += stack.pop()[1];
12 }
13 stack.push(new int[]{price, count});
14 return count;
15 }
16 }
17
18 /**
19 * Your StockSpanner object will be instantiated and called as such:
20 * StockSpanner obj = new StockSpanner();
21 * int param_1 = obj.next(price);
22 */

 python3代码:

 1 class StockSpanner:
2
3 def __init__(self):
4 self.stack = []
5
6 def next(self, price: int) -> int:
7 count = 1
8 while self.stack and self.stack[-1][0] <= price:
9 count += self.stack.pop()[1]
10 self.stack.append((price, count))
11 return count
12
13
14 # Your StockSpanner object will be instantiated and called as such:
15 # obj = StockSpanner()
16 # param_1 = obj.next(price)

小知识:

单调栈:存放的数据是有序的

  • 单调递增栈:就是从栈底到栈顶数据是从大到小
  • 单调递减栈:就是从栈底到栈顶数据是从小到大

单调栈的伪代码:

 1 stack<int> st;
2 //此处一般需要给数组最后添加结束标志符
3 for (遍历这个数组)
4 {
5 if (栈空 || 栈顶元素大于等于当前比较元素)
6 {
7 入栈;
8 }
9 else
10 {
11 while (栈不为空 && 栈顶元素小于当前元素)
12 {
13 栈顶元素出栈;
14 更新结果;
15 }
16 当前数据入栈;
17 }
18 }

力扣901(java&python)-股票价额跨度(中等)的更多相关文章

  1. 【力扣】122. 买卖股票的最佳时机 II

    给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格. 设计一个算法来计算你所能获取的最大利润.你可以尽可能地完成更多的交易(多次买卖一支股票). 注意:你不能同时参与多笔交易(你必须在再次 ...

  2. 【力扣】188. 买卖股票的最佳时机 IV

    给定一个整数数组 prices ,它的第 i 个元素 prices[i] 是一支给定的股票在第 i 天的价格. 设计一个算法来计算你所能获取的最大利润.你最多可以完成 k 笔交易. 注意:你不能同时参 ...

  3. 【力扣】123. 买卖股票的最佳时机 III

    给定一个数组,它的第 i 个元素是一支给定的股票在第 i 天的价格. 设计一个算法来计算你所能获取的最大利润.你最多可以完成 两笔 交易. 注意:你不能同时参与多笔交易(你必须在再次购买前出售掉之前的 ...

  4. LeetCode(力扣)——Search in Rotated Sorted Array2 搜索旋转排序数组 python实现

    题目描述: python实现 Search in Rotated Sorted Array2 搜索旋转排序数组   中文: 假设按照升序排序的数组在预先未知的某个点上进行了旋转. ( 例如,数组 [0 ...

  5. LeetCode(力扣)——Search in Rotated Sorted Array 搜索旋转排序数组 python实现

    题目描述: python实现 Search in Rotated Sorted Array 搜索旋转排序数组   中文:假设按照升序排序的数组在预先未知的某个点上进行了旋转. ( 例如,数组 [0,1 ...

  6. 力扣 122 买卖股票的最佳时机II

    力扣 122 买卖股票的最佳时机II 思路: 动态规划,表面上是\(O(2^n)\)的搜索空间,实际上该天的选择只与前一天的状态(是否持有股票)有关.从收益的角度来看,确实每一天的不同选择都会产生不同 ...

  7. 刷题-力扣-122. 买卖股票的最佳时机 II

    122. 买卖股票的最佳时机 II 题目链接 来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/best-time-to-buy-and-sell ...

  8. 力扣—Reorder List(重排链表)python实现

    题目描述: 中文: 给定一个单链表 L:L0→L1→…→Ln-1→Ln ,将其重新排列后变为: L0→Ln→L1→Ln-1→L2→Ln-2→… 你不能只是单纯的改变节点内部的值,而是需要实际的进行节点 ...

  9. 力扣 ——Linked List Cycle II(环形链表 II) python实现

    题目描述: 中文: 给定一个链表,返回链表开始入环的第一个节点. 如果链表无环,则返回 null. 为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始). ...

  10. 力扣——Linked List Cycle(环形链表) python实现

    题目描述: 中文: 给定一个链表,判断链表中是否有环. 为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始). 如果 pos 是 -1,则在该链表中没有环. ...

随机推荐

  1. 性能优化:编译器优化选项 -O2/-O3 究竟有多强大?

    之前的"性能优化的一般策略及方法"一文中介绍了多种性能优化的方法.根据以往的项目经验,开启编译器优化选项可能是立竿见影.成本最低.效果最好的方式了. 这么说可能还不够直观,举个真实 ...

  2. webpack 项目接入Vite的通用方案介绍(下)

    愿景 希望通过此系列文章,能给读者提供一个存/增量项目接入Vite的点子,起抛砖引玉的作用,减少这方面能力的建设成本 在阐述过程中同时也会逐渐完善webpack-vite-serve这个工具 读者可直 ...

  3. 【atcoder beginner 308E - MEX】

    前缀和 二分查找 打表枚举 代码如下 import java.io.BufferedReader; import java.io.IOException; import java.io.InputSt ...

  4. 记录--H5 实现拍照选景框效果

    这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 背景 在实际项目中,遇到了需要唤起手机摄像头拍照的需求,最开始是通过<input type="file" hid ...

  5. 记录-使用双token实现无感刷新,前后端详细代码

    这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 前言 近期写的一个项目使用双token实现无感刷新.最后做了一些总结,本文详细介绍了实现流程,前后端详细代码.前端使用了Vue3+Vite ...

  6. 记录--短视频滑动播放在 H5 下的实现

    这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 短视频已经无数不在了,但是主体还是使用 app 来承载的.本文讲述 H5 如何实现 app 的视频滑动体验. 无声胜有声,一图顶百辩,且看 ...

  7. oracle job 带参数

    declare job number; begin sys.dbms_job.submit(job => job, what => 'DECLARE S1 VARCHAR2(4000); ...

  8. Linux Mint下Qt Creator无法输入中文解决办法

    注,本文所指的是linux中使用fcitx输入框架下,Qt程序输入中文的解决办法 如果是ibus输入框架,则不需要任何操作,可以直接输入中文 但是微信使用的是fcitx输入框架,且比较常用,故只能使用 ...

  9. python爬虫爬取科技报告数据,共计40余万条(来自国家科技报告服务系统)

    按学科分类[中图分类] 共计三十余万条科技报告数据 爬取的网址:https://www.nstrs.cn/kjbg/navigation !!! 如果要完整地跑起来代码,需要先看一下我的这篇博客,完成 ...

  10. Android Button 点击事件

    Ctrl+Alt+Space(空格键) 可以显示提示内容