解法一 DP
class StockSpanner {
public:
StockSpanner() {}
int next(int price) {
if(prices.empty() || price<prices.back()){
dp.push_back(1);
}else {
int j=dp.size()-1;
while(j>=0 && prices[j]<=price){
j -= dp[j];
}
dp.push_back(dp.size()-j);
}
prices.push_back(price);
return dp.back();
}
private:
vector<int> dp, prices;
};
/**
* Your StockSpanner object will be instantiated and called as such:
* StockSpanner* obj = new StockSpanner();
* int param_1 = obj->next(price);
*/
解法二 stack
class StockSpanner {
public:
StockSpanner() {}
int next(int price) {
int span = 1;
while(!s.empty() && price >= s.top().first){
span += s.top().second;
s.pop();
}
s.emplace(price, span);
return span;
}
private:
stack<pair<int,int>> s;
};
/**
* Your StockSpanner object will be instantiated and called as such:
* StockSpanner* obj = new StockSpanner();
* int param_1 = obj->next(price);
*/