算法训练营day49(12.17)

题目1: 42. 接雨水
代码:

class Solution {
public:
    int trap(vector<int>& height) {
        if(height.size() <= 2) {
            return 0;
        }

        stack<int> stk;
        int result = 0;
        for(int i = 0; i < height.size(); i++) {
            if(stk.empty() || height[i] <= height[stk.top()]) {
                stk.push(i);
            }
            else {
                while(!stk.empty() && height[i] > height[stk.top()]) {
                    int bottom = stk.top();
                    stk.pop();
                    if(!stk.empty()) {
                        int h = min(height[i], height[stk.top()]) - height[bottom];
                        int w = i - stk.top() - 1;
                        result += w *h;
                    }
                }
                stk.push(i);
            }
        }
        return result;
    }
};

题目2:84. 柱状图中最大的矩形
代码:

class Solution {
public:
    int largestRectangleArea(vector<int>& heights) {
        int n = heights.size();
        vector<int> left(n), right(n);
        stack<int> monoStk;

        for(int i = 0; i < heights.size(); i++) {
            while(!monoStk.empty() && heights[monoStk.top()] >= heights[i]) {
                monoStk.pop();
            }
            left[i] = monoStk.empty() ? -1 : monoStk.top();
            monoStk.push(i);
        }

        while(!monoStk.empty()) monoStk.pop();

        for(int i = n - 1; i >= 0; i--) {
            while(!monoStk.empty() && heights[monoStk.top()] >= heights[i]) {
                monoStk.pop();
            }
            right[i] = monoStk.empty() ? n : monoStk.top();
            monoStk.push(i);
        }

        int maxArea = 0;
        for(int i = 0; i < n; i++) {
            maxArea = max(maxArea, (right[i] - left[i] - 1) * heights[i]);
        }
        return maxArea;
    }
};
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容