【力扣】901.股票价格跨度

一、题目描述:

编写一个 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) 小于或等于今天的价格。

提示:

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

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

二、解题思路:
单调栈
  1. 创建两个栈prices中存股票的价格,span中存的是股票跨度。

  2. 如果prices栈不为空并且prices栈顶元素小于等于当天的价格,将prices栈顶元素出栈,将span栈顶元素出栈,并且使用num记录span栈顶元素的值,直到在prices栈中找到一个大于当天的价格的值。

  3. 如果当前prices栈为空或者prices栈顶元素小于当天的价格或者,直接将当天的价格入prices栈,将span栈顶元素置为num。

三、代码描述:
class StockSpanner {
   Stack<Integer> prices=new Stack<>();
    Stack<Integer>  span=new Stack<>();
    public StockSpanner() {

    }
    public int next(int price){
         int num=1;
        while(!prices.isEmpty()&&prices.peek()<=price){
            prices.pop();
            num+=span.pop();
        }
        prices.push(price);
        span.push(num);
        return num;
    }
}

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

你可能感兴趣的:(OJ练习)