zoukankan      html  css  js  c++  java
  • 刷题 | 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;
    };
    
  • 相关阅读:
    点击某个内容复制到粘贴板
    滚动条全局样式
    23个Python爬虫开源项目代码:爬取微信、淘宝、豆瓣、知乎、微博等
    爬虫数据清洗
    邮件二次验证
    mysql基础语句
    orm操作
    解决跨域请求
    第二十一章 线程局部存储区
    第二十章 DLL高级技术
  • 原文地址:https://www.cnblogs.com/casperwin/p/12920912.html
Copyright © 2011-2022 走看看