Write a class StockSpanner which collects daily price quotes for some stock, and returns the span of that stock's price for the current day.
The span of the stock's price today is defined as the maximum number of consecutive days (starting from today and going backwards) for which the price of the stock was less than or equal to today's price.
For example, if the price of a stock over the next 7 days were [100, 80, 60, 70, 60, 75, 85], then the stock spans would be [1, 1, 1, 2, 1, 4, 6].
Example 1:
Input: ["StockSpanner","next","next","next","next","next","next","next"], [[],[100],[80],[60],[70],[60],[75],[85]] Output: [null,1,1,1,2,1,4,6] Explanation: First, S = StockSpanner() is initialized. Then: S.next(100) is called and returns 1, S.next(80) is called and returns 1, S.next(60) is called and returns 1, S.next(70) is called and returns 2, S.next(60) is called and returns 1, S.next(75) is called and returns 4, S.next(85) is called and returns 6. Note that (for example) S.next(75) returned 4, because the last 4 prices (including today's price of 75) were less than or equal to today's price.
Note:
- Calls to
StockSpanner.next(int price)will have1 <= price <= 10^5. - There will be at most
10000calls toStockSpanner.nextper test case. - There will be at most
150000calls toStockSpanner.nextacross all test cases. - The total time limit for this problem has been reduced by 75% for C++, and 50% for all other languages.
思路:单调栈,题意就是对当天的股票求连续天数直到比当天大为止的长度,可见pop的时候必须是遇到更大的股票也就是维护一个递减栈
代码:
class StockSpanner {
public:
stack<pair<int,int>> st;
StockSpanner() {
}
int next(int price) {
int res=1;
while(!st.empty()&&st.top().first<=price){
res+=st.top().second;st.pop();
}
st.push({price,res});
return res;
}
};
/**
* Your StockSpanner object will be instantiated and called as such:
* StockSpanner* obj = new StockSpanner();
* int param_1 = obj->next(price);
*/
股票跨度计算器

本文介绍了一个名为StockSpanner的类,该类收集每日股票价格并返回当前价格的跨度。跨度定义为从今天开始向后查找的最大连续天数,其中股票价格小于或等于今天的价格。文章通过一个示例解释了如何使用该类,并提供了一个使用单调栈实现的代码示例。
316

被折叠的 条评论
为什么被折叠?



