LeetCode、901. 股票价格跨度【中等,单调栈】

文章目录

前言

博主介绍:✌目前全网粉丝2W+,csdn博客专家、Java领域优质创作者,博客之星、阿里云平台优质作者、专注于Java后端技术领域。

涵盖技术内容:Java后端、算法、分布式微服务、中间件、前端、运维、ROS等。

博主所有博客文件目录索引:博客目录索引(持续更新)

视频平台:b站-Coder长路


LeetCode、901. 股票价格跨度【中等,单调栈】

题目链接及分类

题目链接:LeetCode、901. 股票价格跨度

分类:数据结构/栈/单调栈


思路

思路1:暴力

复杂度分析:n次next()为时间复杂度O(n2)

java 复制代码
class StockSpanner {

    private List<Integer> list;

    //1万数据量,O(n)、O(nlogn)
    //题意:找到距离当前的最大连续长度
    public StockSpanner() {
        list = new ArrayList<>();
    }
    
    //暴力O(n)
    public int next(int price) {
        int count = 1;
        for (int i = list.size() - 1; i >= 0; i--) {
            if (list.get(i) <= price) count++;
            else break;
        }
        list.add(price);
        return count;
    }
}

思路2:单调栈写法

复杂度分析:n次next()为时间复杂度O(n)

java 复制代码
class StockSpanner {

    private Stack<Pair<Integer, Integer>> stack = new Stack<>();

    //1万数据量,O(n)、O(nlogn)
    public StockSpanner() {
    }
    
    //数据集 及  结果集
    //[100,80,60,70,60,75,85]   [1,1,1,2,1,4,6]
    //处理的过程:
    //(100,1)、(80, 1)、(60, 1)
    //(100,1)、(80,1)、(70, 2)、(60, 1)
    //(100,1)、(80,1)、(70, 2)、(75,2)
    //(100,1)、(85,6)
    //单调栈解法
    //记录两个值(price价格、和当日价格的跨度)
    //每次next()的时间复杂度O(1),那么n次next()调用就是O(n)的复杂度
    public int next(int price) {
        int res = 1;
        //维护一个最大值
        while (!stack.isEmpty() && price >= stack.peek().getKey()) {
            int len = stack.peek().getValue();
            //弹出当前的
            stack.pop();
            res += len;
        }
        //入栈
        stack.push(new Pair<Integer, Integer>(price, res));
        return res;
    }
}

优化:单调栈简化写法(数组替代栈集合)

效果:减少了入栈出栈的开销

复杂度分析:n次next()为时间复杂度O(n)

java 复制代码
class StockSpanner {

    //存储价格
    private int[] prices = new int[10000];
    //存储对应价格当前的跨度
    private int[] lens = new int[10000];
    //表示当前的指针位置
    private int pos = -1;

    public StockSpanner() {
    }
    
    //学习题解:https://leetcode.cn/submissions/detail/375037369/
    //price next pos
    //100   1     0
    //80    1     1
    //60    1     2  
    //70    2     3
    //60    1     4
    //75    4     5
    //85    6     6
    public int next(int price) {
        int res = 1;//初始值
        //计算跨度
        int cur = pos;
        //单调栈(注意cur -= lens[cur],下次定位就直接定位到该元素位置-跨度的地方再做比较)
        while (cur >= 0 && price >= prices[cur]) {
            cur -= lens[cur];
        }
        //记录[cur, pos]的长度(也就是之间的跨度)
        res += (pos - cur);
        //记录价值以及跨度
        ++pos;
        prices[pos] = price;
        lens[pos] = res;
        return res;
    }
}

资料获取

大家点赞、收藏、关注、评论啦~

精彩专栏推荐订阅:在下方专栏👇🏻

更多博客与资料可查看👇🏻获取联系方式👇🏻,🍅文末获取开发资源及更多资源博客获取🍅


整理者:长路 时间:2024.2.13

相关推荐
快手技术1 分钟前
快手 & 南大发布代码智能“指南针”,重新定义 AI 编程能力评估体系
算法
Murphy_lx14 分钟前
C++ std_stringstream
开发语言·c++·算法
CoovallyAIHub1 小时前
超越YOLOv8/v11!自研RKM-YOLO为输电线路巡检精度、速度双提升
深度学习·算法·计算机视觉
哭泣方源炼蛊1 小时前
HAUE 新生周赛(七)题解
数据结构·c++·算法
q***64971 小时前
SpringMVC 请求参数接收
前端·javascript·算法
Lwcah1 小时前
Python | LGBM+SHAP可解释性分析回归预测及可视化算法
python·算法·回归
小此方1 小时前
从零开始手搓堆:核心操作实现 + 堆排序 + TopK 算法+ 向上调整 vs 向下调整建堆的时间复杂度严密证明!
开发语言·数据结构·算法
前端炒粉5 小时前
35.LRU 缓存
开发语言·javascript·数据结构·算法·缓存·js
断剑zou天涯7 小时前
【算法笔记】窗口内最大值或最小值的更新结构
java·笔记·算法