240
笔下虽有千言,胸中实无一策

刷题 | 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;
};
posted @ 2020-05-20 03:06  CasperWin  阅读(156)  评论(0编辑  收藏  举报