首页 > 编程语言 >代码随想录算法训练营第 49 天 |LeetCode42 接雨水 LeetCode84 柱状图中最大面积矩形

代码随想录算法训练营第 49 天 |LeetCode42 接雨水 LeetCode84 柱状图中最大面积矩形

时间:2024-08-23 15:27:05浏览次数:9  
标签:49 int 栈顶 top 元素 随想录 mid height 柱状图

代码随想录算法训练营

Day49 代码随想录算法训练营第 49 天 |LeetCode42 接雨水 LeetCode84 柱状图中最大面积矩形


目录


前言

LeetCode42 接雨水

讲解文档

LeetCode84 柱状图中最大面积矩形

讲解文档


一、LeetCode42 接雨水

1.题目链接

LeetCode42 接雨水

2.思路

(1)寻找元素height[i]前后第一个大于它的元素,左边第一个大于height[i]的元素记作height[left] ,右边第一个大于height[i]的元素记作height[right],[left+1,right-1]区间内,height[i]为最大高度
和原来的相比,增加了[left+1,right-1]区间内,最小高度差的雨水,即
(min(height[right],height[left])-height[mid])*(right-left-1)
(2)单调栈
1)下标0入
2)height[i]小于等于栈顶元素,入栈
3)循环:栈不空,且height[i]小于栈顶元素

  • 栈顶下标记作mid(因为栈顶元素在中间)
  • 弹出
  • 如果空:mid左边没有比他大的,所以跳过
  • 如果不空:
    • 现在的栈顶,原本的栈顶之下第一个元素是左边第一个大于height[mid]的元素
    • 当前增加了[s.top()+1,i-1]区间内,最小高度差的雨水
      res +=(min(height[s.top()], height[i]) - height[mid])*(i - s.top() - 1)

3.题解

class Solution {
public:
    stack<int> s;
    int trap(vector<int>& height) {
        int res = 0;
        s.push(0);
        int n = height.size();
        for (int i = 1; i < n; i++) {

            if (height[s.top()] > height[i]) {
                s.push(i);

            } else if(height[s.top()] ==height[i])
            {
                s.pop();
                s.push(i);
            }
            else {
                while (!s.empty() && height[s.top()] < height[i]) {
                    int mid = s.top();
                    s.pop();
                    if (!s.empty()) {
                        int h = min(height[s.top()], height[i]) - height[mid];
                        int w = i - s.top() - 1;
                        res += w * h;
                        
                    }
                }
                s.push(i);
            }
        }
        return res;
    }
};

二、LeetCode84 柱状图中最大面积矩形

1.题目链接

LeetCode84 柱状图中最大面积矩形

2.思路

(1)寻找元素height[i]前后第一个小于它的元素,左边第一个小于height[i]的元素记作height[left] ,右边第一个小于height[i]的元素记作height[right]
[left+1,right-1]区间内,height[i]为最大高度
当前矩形面积为[left+1,right-1]区间内,高为height[i]的矩形面积
(2)单调栈
1)下标0入
2)height[i]大于等于栈顶元素,入栈
3)循环:栈不空,且height[i]小于栈顶元素

  • 栈顶下标记作mid(因为栈顶元素在中间)
  • 弹出
  • 如果空:当前矩形面积为[mid,i-1]区间内,高为height[mid]的矩形面积
    当次结果为(i-mid)*height[mid]
  • 如果不空:
    • 现在的栈顶,原本的栈顶之下第一个元素是左边第一个小于height[mid]的元素
    • 当前矩形面积为[s.top()+1,i-1]区间内,高为height[mid]的矩形面积
      当次结果为(i-s.top()-1)*height[mid]

3.题解

class Solution {
public:
    stack<int> s;
    int largestRectangleArea(vector<int>& heights) {
        int res = 0;
        heights.insert(heights.begin(), 0); // 数组头部加入元素0
        heights.push_back(0);               // 数组尾部加入元素0
        int n = heights.size();
        s.push(0);
        for (int i = 1; i < n; i++) {
            if (heights[s.top()] <= heights[i]) {
                s.push(i);
            } else {
                while (!s.empty() && heights[s.top()] > heights[i]) {
                    int mid = s.top();
                    s.pop();
                    if (s.empty()) {
                        res = max(res, heights[mid] * (i - mid));
                    } else {

                        res = max(res, heights[mid] * (i - s.top() - 1));
                    }
                }
                s.push(i);
            }
        }
        return res;
    }
};

总结

单调栈用于解决寻找元素左右第一个大于或小于它的元素位置的问题
单调栈里面存放的元素都是待处理的元素

标签:49,int,栈顶,top,元素,随想录,mid,height,柱状图
From: https://blog.csdn.net/2301_79647020/article/details/141433076

相关文章

  • 代码随想录算法训练营第 48 天 |LeetCode 739. 每日温度 LeetCode496.下一个更大元素
    代码随想录算法训练营Day48代码随想录算法训练营第48天|LeetCode739.每日温度LeetCode496.下一个更大元素ILeetCode503.下一个更大元素II目录代码随想录算法训练营前言LeetCode739.每日温度LeetCode496.下一个更大元素ILeetCode503.下一个更大元素II一......
  • 代码随想录day 38 || 322 零钱兑换,279 完全平方数,139 单词拆分
    322零钱找还funccoinChange(coins[]int,amountint)int{ //装满,并且硬币无限,可以类比完全背包问题 //dp[i][j]表示前i个物品装满容量为j的背包所需要的最少物品数量 //递推公式dp[i][j]=min(dp[i-1][j],dp[i][j-w(i)]+1)//不装物品i的物品数量,装物品i的物品数......
  • 代码随想录DAY22 - 回溯算法 - 08/21
    目录理论回顾什么是回溯法回溯法的效率回溯法解决的问题如何理解回溯组合题干思路和代码递归法递归优化:剪枝组合总和Ⅲ题干思路和代码递归法递归优化电话号码的字母组合题干思路和代码递归法理论回顾什么是回溯法回溯是一种类似枚举的搜索方法,回溯和......
  • 代码随想录DAY23 - 回溯算法 - 08/22
    组合总和题干题目:给你一个无重复元素的整数数组candidates和一个目标整数target,找出candidates中可以使数字和为目标数target的所有不同组合,并以列表形式返回。你可以按任意顺序返回这些组合。candidates中的同一个数字可以无限制重复被选取。如果至少......
  • 代码随想录算法训练营第二十三天(回溯 二)
    力扣题部分:39.组合总和题目链接:.-力扣(LeetCode)题面:给你一个 无重复元素 的整数数组 candidates 和一个目标整数 target ,找出 candidates 中可以使数字和为目标数 target 的所有 不同组合 ,并以列表形式返回。你可以按 任意顺序 返回这些组合。candid......
  • 代码随想录算法训练营第二十二天(回溯 一)
    开始学习回溯!回溯理论基础代码随想录文章链接:代码随想录文章摘要:什么是回溯法回溯法也可以叫做回溯搜索法,它是一种搜索的方式。在二叉树系列中,我们已经不止一次,提到了回溯。回溯是递归的副产品,只要有递归就会有回溯。所以以下讲解中,回溯函数也就是递归函数,指的都是一......
  • 代码随想录Day23
    131.分割回文串给你一个字符串s,请你将s分割成一些子串,使每个子串都是回文串。返回s所有可能的分割方案。示例1:输入:s="aab"输出:[["a","a","b"],["aa","b"]]示例2:输入:s="a"输出:[["a"]]提示:1<=s.length<=16s仅由......
  • 「代码随想录算法训练营」第四十四天 | 图论 part2
    200.岛屿数量题目链接:https://leetcode.cn/problems/number-of-islands/description/文章讲解:https://programmercarl.com/kamacoder/0099.岛屿的数量深搜.html题目难度:中等题目状态:看题解思路一:深搜版方法dfs:参数:接受一个字符网格grid和当前坐标(r,c)。功能:......
  • 给自己复盘的随想录笔记-移除元素
    双指针法双指针法(快慢指针法): 通过一个快指针和慢指针在一个for循环下完成两个for循环的工作。定义快慢指针快指针:寻找新数组的元素,新数组就是不含有目标元素的数组慢指针:指向更新新数组下标的位置相关题目删除有序数组中的重复项解题思路:解法:双指针首先注意数组......
  • 给自己复盘用的随想录笔记day1-二分查找
    二分法使用情景数组为有序数组,同时题目还强调数组中无重复元素,因为一旦有重复元素,使用二分查找法返回的元素下标可能不是唯一的,这些都是使用二分法的前提条件,当大家看到题目描述满足如上条件的时候,可要想一想是不是可以用二分法了。求某一个整数的平方根边界条件写二分法......