AcWing
  • 首页
  • 课程
  • 题库
  • 更多
    • 竞赛
    • 题解
    • 分享
    • 问答
    • 应用
    • 校园
  • 关闭
    历史记录
    清除记录
    猜你想搜
    AcWing热点
  • App
  • 登录/注册

LeetCode 901. 股票价格跨度    原题链接    中等

作者: 作者的头像   wzc1995 ,  2018-09-10 02:40:01 ,  所有人可见 ,  阅读 2042


3


1

题目描述

设计一个算法收集某些股票的每日报价,并返回该股票当日价格的 跨度。

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

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

实现 StockSpanner 类:

  • StockSpanner() 初始化类对象。
  • int next(int price) 给出今天的股价 price,返回该股票当日价格的 跨度。

样例

输入:
["StockSpanner", "next", "next", "next", "next", "next", "next", "next"]
[[], [100], [80], [60], [70], [60], [75], [85]]
输出:
[null, 1, 1, 1, 2, 1, 4, 6]

解释:
StockSpanner stockSpanner = new StockSpanner();
stockSpanner.next(100); // 返回 1
stockSpanner.next(80);  // 返回 1
stockSpanner.next(60);  // 返回 1
stockSpanner.next(70);  // 返回 2
stockSpanner.next(60);  // 返回 1
stockSpanner.next(75);  // 返回 4,
    因为截至今天的最后 4 个股价 (包括今天的股价 75) 都小于或等于今天的股价。
stockSpanner.next(85);  // 返回 6

限制

  • 1 <= price <= 10^5
  • 最多调用 next 方法 10^4 次。

算法

(单调栈) $O(n)$
  1. 这道题的本质是寻找每个数左边第一个比它严格大的数字。
  2. 故可以采用单调栈的思想,维护一个单调递减的栈,栈中存放数字的下标。
  3. 每次新加入一个数字时,若栈顶小于等于当前数字,则出栈直到栈空或者栈顶严格大于当前数字;
  4. 则栈顶距离新插入数字的下标的距离就是答案,然后将新数字压栈。

时间复杂度

  • 每个数字最多进栈一次出栈一次,故时间复杂度为 $O(n)$。

C++ 代码

class StockSpanner {
private:
    vector<int> prices;
    int counter;
    stack<int> s;

public:
    StockSpanner() {
        counter = 0;
    }

    int next(int price) {
        int ans;
        while (!s.empty() && prices[s.top()] <= price)
            s.pop();

        if (s.empty()) ans = counter + 1;
        else ans = counter - s.top();

        prices.push_back(price);
        s.push(counter);

        counter++;
        return ans;
    }
};

/**
 * Your StockSpanner object will be instantiated and called as such:
 * StockSpanner* obj = new StockSpanner();
 * int param_1 = obj->next(price);
 */

3 评论


用户头像
温柔的木头Crystal   2023-05-10 07:35         踩      回复

这个刚做完两题栈的题目,好难理解哇


用户头像
贺谦   2020-05-17 09:45         踩      回复

这个counter表示的是什么呀?

用户头像
wzc1995   2020-05-17 11:52         踩      回复

counter 表示的是下标,单调栈中要存下标


App 内打开
你确定删除吗?
1024
x

© 2018-2025 AcWing 版权所有  |  京ICP备2021015969号-2
用户协议  |  隐私政策  |  常见问题  |  联系我们
AcWing
请输入登录信息
更多登录方式: 微信图标 qq图标 qq图标
请输入绑定的邮箱地址
请输入注册信息