【每日一题Day3】LC901.股票价格跨度

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

股票价格跨度【LC901】


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


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


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


感冒快快好,脑子快转不起来了


暴力


class StockSpanner {
    List<Integer> list ;
    public StockSpanner() {
        list = new ArrayList<>();
    }
    public int next(int price) {
        int size = list.size();
        int res = 1;
        for (int i = size - 1; i >= 0; i--){
            if (list.get(i) <= price){
                res++;
            }else{
                break;
            }
        }
        list.add(price);
        return res;
    }
}


单调栈


调用next时,需要返回从今天开始往回数,股票价格小于或等于今天价格的最大连续日数。如果把每日的 price当成数组不同下标的值,即需要求出每个值与上一个更大元素之间的下标之差—>单调栈


  • 单调栈里存放的元素:股票价格的下标(即天数)和股票价格的二元组,首先在栈中先插入一个最大值作为天数为-1天的价格。


  • 单调栈里元素从栈头到栈底的顺序为递增


  • 单调栈的判断条件


。当前遍历的元素T[i]小于栈顶元素T[st.top()]的情况


将当前元素入栈,并计算下标差返回


。当前遍历的元素T[i]大于等于栈顶元素T[st.top()]的情况


将栈顶元素弹出


class StockSpanner {
    Deque<int[]> st;
    int idx;
    public StockSpanner() {
        st = new LinkedList<>();
        st.addFirst(new int[]{-1,Integer.MAX_VALUE});
        idx = -1;
    }
    public int next(int price) {
        idx++;
        while (price >= st.peekFirst()[1]){
            st.pollFirst();
        }
        int res = idx - st.peekFirst()[0];
        st.addFirst(new int[]{idx,price});
        return res;       
    }
}
/**
 * Your StockSpanner object will be instantiated and called as such:
 * StockSpanner obj = new StockSpanner();
 * int param_1 = obj.next(price);
 */


目录
相关文章
|
6月前
|
算法
【每日一题Day363】LC275H 指数Ⅱ | 二分答案
【每日一题Day363】LC275H 指数Ⅱ | 二分答案
55 0
|
6月前
【每日一题Day312】LC2240买钢笔和铅笔的方案数 | 完全背包 数学
【每日一题Day312】LC2240买钢笔和铅笔的方案数 | 完全背包 数学
60 0
|
6月前
【每日一题Day342】LC2578最小和分割 | 贪心
【每日一题Day342】LC2578最小和分割 | 贪心
46 0
|
6月前
【每日一题Day141】LC2379得到 K 个黑块的最少涂色次数 | 滑动窗口
【每日一题Day141】LC2379得到 K 个黑块的最少涂色次数 | 滑动窗口
41 0
|
6月前
|
人工智能 BI
【每日一题Day354】LC2316统计无向图中无法互相到达点对数 | 并查集
【每日一题Day354】LC2316统计无向图中无法互相到达点对数 | 并查集
54 0
|
6月前
leetcode-901:股票价格跨度
leetcode-901:股票价格跨度
35 0
|
6月前
【每日一题Day165】LC1039多边形三角剖分的最低得分 | 区间dp
【每日一题Day165】LC1039多边形三角剖分的最低得分 | 区间dp
57 0
|
6月前
【每日一题Day362】LC274H 指数 | 二分答案
【每日一题Day362】LC274H 指数 | 二分答案
38 0
|
6月前
|
存储
【每日一题Day219】LC1093大样本统计 | 模拟
【每日一题Day219】LC1093大样本统计 | 模拟
50 0
|
6月前
【每日一题Day320】LC2651计算列车到站时间 | 数学
【每日一题Day320】LC2651计算列车到站时间 | 数学
45 0