力扣算法刷题Day 49(接雨水)

42 接雨水

题目链接

添加链接描述

思路

首先可以看到,对于一个位置水的高度,取决于右边第一个不小于它的高度的柱子。通过单调栈可以轻松找出右边第一个大于等于自身的柱子。

如何计算水的容量?按高度计算,对于一个池的而言,每一处位置的水的高度 = min(左,右)- 柱子高度,最后相加就是该处池子的水容量。

问题:按列计算难以判断池子的左边界。有多种情况:左边比右边小;当前左边比右边小,但更左边有更大的;以及递减之类。按列会比较难受。因此改用按行计算。

将计算逻辑变动一下即可:当遍历元素大于栈顶元素(递减栈)时,形成凹槽,分别计算凹槽的长和宽,相乘。

文章详解

添加链接描述

cpp 复制代码
class Solution {
public:
    int trap(vector<int>& height) {
        int sum = 0;
        if(height.size() <= 2){
            return sum;
        }
        stack<int> st;
        st.push(0);
        for(int i = 1; i < height.size(); i++)
        {
            if(height[i] < height[st.top()]){
                st.push(i);
            }else if(height[i] == height[st.top()]){
                st.pop();
                st.push(i); //保留右边的
            }else {
                while(!st.empty() && height[st.top()] < height[i]){  //
                    int mid = st.top();
                    st.pop();
                    if(!st.empty()){
                        int h = min(height[i],height[st.top()]) - height[mid];
                        int w = i - st.top() - 1; //注意减一
                        sum += h * w;
                    }
                }
                st.push(i);
            }
        }
        return sum;
    }
};

84 柱状图最大矩形

题目链接

添加链接描述

思路

与接雨水相反,这里要变成右边第一个小于它的,递增栈

文章详解

添加链接描述

cpp 复制代码
class Solution {
public:
    int largestRectangleArea(vector<int>& heights) {
        stack<int> st;
        heights.insert(heights.begin(), 0); // 数组头部加入元素0
        heights.push_back(0); // 数组尾部加入元素0
        st.push(0);
        int result = 0;
        for (int i = 1; i < heights.size(); i++) {
            while (heights[i] < heights[st.top()]) {
                int mid = st.top();
                st.pop();
                int w = i - st.top() - 1;
                int h = heights[mid];
                result = max(result, w * h);
            }
            st.push(i);
        }
        return result;
    }
};
相关推荐
JustNow_Man21 分钟前
【Harness】本地文本向量化搜索解决方案--qmd
git·python·算法
敲代码的苦1337 分钟前
头歌 数据结构—消防资源调度
数据结构·算法
布莱克60544 分钟前
C++ 中 set 与 map 的区别详解
开发语言·c++·算法·哈希
lisw051 小时前
算法与软件的本质区别
驱动开发·算法·数学建模
上海红同电子1 小时前
红同电子线束工厂100问|绝缘护套采购,材质PVC、TPE、PP该如何选型?
数据库·经验分享·职场和发展·产品运营·制造·材质
我不会插花弄玉1 小时前
5.Hash 【由浅入深-redis】
redis·算法·哈希算法
j7~1 小时前
IT 面试指南:从准备到 Offer 的完整路线图(校招 / 实习通用
面试·职场和发展·秋招·春招·实习面试·it后端
Nuanyt1 小时前
LeetCode Hot 100 · 双指针 3 题 Java
java·笔记·算法·leetcode·双指针
小淮AI2 小时前
面试前 48 小时,怎样练表达和复盘:一份个人准备记录
面试·职场和发展
志起计算机编程2 小时前
Clickhouse的几个关键优势
算法