1. トピック
2. アイデア
左方向、<= この値、連続最大間隔。
つまり、左方向では、最初の >= この値、最大添え字間の差です。
これは最初の問題 >= この値であるため、モノトニック スタックで解決できます。
したがって、単調に減少するスタックが構築されます (スタックの下部からスタックの上部に減少します)。スタックに記録されますpair<下标,值>
。新しい要素がスタックの先頭にある場合は、スタックをポップし、新しい要素がスタックにプッシュされた場合は、インデックスとスタックの先頭の差を記録します。
以下のテスト ケースに注意してください: 3 番目の要素は 3 の出力を想定しているため、その間に > の代わりに >= を使用します。
3. 問題解決
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);
*/