901. 股票价格跨度

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

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

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

实现 StockSpanner 类:

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


与739. 每日温度类似
思路:
  使用单调栈。及时去掉无用数据,保证栈中元素有序。

  题目要求寻找小于等于当天价格的连续天数,可以理解为只关注比该天小的天数即可,后续可以无需再关注价格小的这些天。

  如图所示,我们需要记录天数索引以及对应的价格即可。使用单调栈保存他们。新加入元素时,弹出不大于新元素的栈顶元素,直接将该天数减去栈顶元素即可。很经典的一道题。

901. 股票价格跨度_第1张图片

class StockSpanner {
    private final Deque<int[]> stack = new ArrayDeque();
    private int curDay = -1;

    public StockSpanner() {
        stack.push(new int[]{-1, Integer.MAX_VALUE});
    }
    
    public int next(int price) {
        while(price>=stack.peek()[1]) {
            stack.pop();
        }
        curDay ++;
        int ans = curDay - stack.peek()[0];
        stack.push(new int[]{curDay, price});
        return ans;
    }
}

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

你可能感兴趣的:(算法,数据结构,leetcode)