LeetCode 901股票价格跨度Medium
-
题目简述:编写一个 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]
-
思路:单调栈
-
题目本质是求取每个数左边第一个比它严格大的数字。
-
单调减栈每次插入新数据时,会一次性将比自己小的元素全部排出
-
如果将要插入的元素满足单调栈本身的递减需求,则加入栈中
-
如果将要插入的元素大于栈顶元素,则出栈直到栈空或者栈顶严格大于当前数字;
-
class StockSpanner {
public:
vector<int> prices;
stack<int> st;
int cnt;//下标
StockSpanner() {
prices.clear();
cnt = 0;
}
int next(int price) {
int res = 0;
while(!prices.empty() && prices[st.top()] <= price)
st.pop();
if (st.empty())
res = cnt + 1;
else
res = cnt - st.top();
prices.push_back(price);
st.push(cnt);
cnt++;
return res;
}
};
/**
* Your StockSpanner object will be instantiated and called as such:
* StockSpanner* obj = new StockSpanner();
* int param_1 = obj->next(price);
*/
- 写法二
class StockSpanner {
public:
stack<int> prices;
stack<int> st;
StockSpanner() {
}
int next(int price) {
int res = 1;
while(!prices.empty() && prices.top() <= price)
{
prices.pop();
res += st.top();
st.pop();
}
prices.push(price);
st.push(res);
return res;
}
};
/**
* Your StockSpanner object will be instantiated and called as such:
* StockSpanner* obj = new StockSpanner();
* int param_1 = obj->next(price);
*/