901. 股票价格跨度

901. 股票价格跨度

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

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

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

题目链接

单调栈

单调递增栈:单调递增栈就是从栈底到栈顶数据是从大到小
单调递减栈:单调递减栈就是从栈底到栈顶数据是从小到大

stack<int> st;
//此处一般需要给数组最后添加结束标志符,具体下面例题会有详细讲解
for (遍历这个数组)
{
	if (栈空 || 栈顶元素大于等于当前比较元素)
	{
		入栈;
	}
	else
	{
		while (栈不为空 && 栈顶元素小于当前元素)
		{
			栈顶元素出栈;
			更新结果;
		}
		当前数据入栈;
	}
}

根据题目描述,我们可以知道,对于当日价格 price,从这个价格开始往前找,找到第一个比这个价格大的价格,这两个价格的下标差 cnt 就是当日价格的跨度。

class StockSpanner {
public:
    stack<pair<int,int>>s;

    StockSpanner() {
        while(!s.empty())
            s.pop();
    }
    
    int next(int price) {
        int cnt=1;
        while(!s.empty()&&s.top().first<=price){
            cnt+=s.top().second;
            s.pop();
        }
        s.push({price,cnt});
        return cnt;
    }
};

posted @ 2022-10-21 09:55  认真游泳的鱼  阅读(143)  评论(0)    收藏  举报