刷题 | Leetcode 901. Online Stock Span | Stack
这道题是被认为属于 Stack 范畴的题,但我一开始解题的时候,并没有察觉到 pop 操作的需要。我理解这里需要一个维护历史记录的数据结构,那么 vector 也就足够了。
下面是我的被 Accept 的解答:
class StockSpanner {
public:
StockSpanner() {
count = 0;
}
int next(int price) {
history.push_back(price);
count++;
int span = 0;
if(count >= 2 && history[count-2] <= history[count-1]) {
span = spans[count-2]+1;
} else {
span = 1;
spans.push_back(span);
return span;
}
for(int i = count-spans[count-2]-2; i >= 0; i--) {
if(history[i] <= history[count-1]) {
span++;
} else {
spans.push_back(span);
break;
}
}
if(spans.size() < count) spans.push_back(span);
return span;
}
private:
vector<int> history;
vector<int> spans;
int count;
};
讨论版上,主流的解答是用一个 stack 来进行维护历史记录,其中有些记录在操作过程中会被消除,这是我比较起疑的地方——这些之前的记录会不会需要被查询?还是说这是多余的考虑?
以下是根据主流解答改写的 C++ 解答:
class StockSpanner {
public:
StockSpanner() {}
int next(int price) {
int span = 1;
while (!s.empty() && s.top().first <= price) {
span += s.top().second;
s.pop();
}
s.push({price, span});
return span;
}
private:
stack<pair<int, int>> s;
};