【LeetCode】901、 股票价格跨度

一、题目

901. 股票价格跨度

二、思路

左边方向,<= 本值的,连续最大间隔。

即为左边方向,第一个 >= 本值,的最大下标之差。

既然是第一个 >= 本值的问题,即可用单调栈解决。

因此构造单调递减栈(从栈底向栈顶方向递减)。栈里记录了 pair<下标,值>。当新元素 >= 栈顶时出栈,当新元素入栈时记录和栈顶的下标之差。

注意下图的测试用例:第三个元素期望输出为3,因此 while 内用 >= 而不是 > 来判断:

在这里插入图片描述

三、题解

class StockSpanner {
    
    
public:
    StockSpanner() {
    
    
        st.emplace(-1,INT_MAX);
        idx = -1;
    }

    int next(int price) {
    
    
        ++idx;
        while (!st.empty() && price >= st.top().second) {
    
    
            st.pop();
        }
        int ret = idx - st.top().first;
        st.emplace(idx, price);
        return ret;
    }
private:
    stack<pair<int,int>> st;
    int idx;
};

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

猜你喜欢

转载自blog.csdn.net/jiaoyangwm/article/details/127468571