常见算法——单调栈

由于各种原因需要重新熟悉一下常见算法,最近一段时间写代码少,就从leetcode上找些题练练手。今天做的题目是:739.每日温度。

看到这个题很容易想到单调栈。单调栈是什么呢?从字面意思很容易看出来,单调栈首先是一个栈结构,满足后进先出(LIFO),再就是从栈顶到栈底的值是逐渐递增或者逐渐递减。

739的题目就不再描述了,题目链接:https://leetcode-cn.com/problems/daily-temperatures/
下面是我写的第一版代码,结果是过了34个用例,第35个超时。先看下我的代码:

class Solution {
    
    
public:
    vector<int> dailyTemperatures(vector<int>& T) {
    
    
        uint32_t elementCount = T.size();
        std::stack<int> s;
        std::vector<int> subScripts;
        std::vector<int> result(elementCount, 0);

        for (int i = 0; i < elementCount; ++i) {
    
    
            if (s.empty()) {
    
    
                s.push(T[i]);
                subScripts.emplace_back(i);
                continue;
            } else {
    
    
                for (int j = 0; j < subScripts.size(); ++j) {
    
    
                    ++ result[subScripts[j]];
                }
                while (!s.empty()) {
    
    
                    if (T[i] > s.top()) {
    
    
                        s.pop();
                        subScripts.pop_back();
                    } else {
    
    
                        break;
                    }
                }
                s.push(T[i]);
                subScripts.emplace_back(i);
            }
        }

        if (!s.empty()) {
    
    
            for (int j = 0; j < subScripts.size(); ++j) {
    
    
                result[subScripts[j]] = 0;
            }
        }

        return result;
    }
};

首先分析一下有没有什么操作是可以节省的?

  1. 保存值的栈s和保存下标的subScripts是重复的,用一个数据结构就可以
  2. 计算更高气温的天数,用下标相减就可以得到,不需要通过进栈数来获取

下面是修改后的代码:

class Solution {
    
    
public:
    vector<int> dailyTemperatures(vector<int>& T) {
    
    
        uint32_t elementCount = T.size();
        std::stack<int> subScripts;
        std::vector<int> result(elementCount, 0);

        for (int i = 0; i < elementCount; ++i) {
    
    
            if (subScripts.empty()) {
    
    
                subScripts.push(i);
                continue;
            } else {
    
    
                while (!subScripts.empty()) {
    
    
                    if (T[i] > T[subScripts.top()]) {
    
    
                        result[subScripts.top()] = i - subScripts.top();
                        subScripts.pop();
                    } else {
    
    
                        break;
                    }
                }
                subScripts.push(i);
            }
        }

        return result;
    }
};

就先写这么多,早日重回代码癫疯,hia hia hia

おすすめ

転載: blog.csdn.net/itlilyer/article/details/116426074