算法|Day52 单调栈3

这篇具有很好参考价值的文章主要介绍了算法|Day52 单调栈3。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

LeetCode 84.柱状图中最大的矩形

题目链接:力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台

题目描述:给定 n 个非负整数,用来表示柱状图中各个柱子的高度。每个柱子彼此相邻,且宽度为 1 。

求在该柱状图中,能够勾勒出来的矩形的最大面积。

解题思路

这题我们就是以每个柱子为基准,找到左边第一个比它矮的柱子left,右边第一个比它矮的柱子right,由于左右都比它矮,所以算矩形的时候肯定不能带上左右的柱子,中间的宽度也就是right - left - 1.这样就得到了宽度,我们再取以当前柱子为基准的高度,相乘再取result的最大值即可。

本题有几个需要注意的细节,首先我们找左右小于当前柱子高度的柱子的时候,我们应该用单调递减的栈来操作,找大于当前柱子的时候才用递增栈操作。

其次我们应该在原本柱子的首尾填上两个0,为什么呢?我们来看如下两种情况。

  • 情况一:

算法|Day52 单调栈3,算法

当前我们已经遍历完了所以的柱子,确一次都没有操作,原因就是这个柱子的高度本身就是单调递增的,进栈之后变成单减的。找不到右边比其小的柱子,所以无法操作。而我们在其右边也就是结尾处加一个0,就可以正常操作了。

  • 情况二:

算法|Day52 单调栈3,算法

当前我们遍历到20的时候找不到左边比其小的柱子,就不会进行正常的操作,也就是不会取50这个柱子单独的面积,所以我们应该在开头也加上一个0,以保证正常操作。

// 版本二
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;
    }
};

总结:文章来源地址https://www.toymoban.com/news/detail-708828.html

  • 单调栈的应用,需要多想想为什么这里能用到单调栈。并且是想想用单增栈还是单减栈。

到了这里,关于算法|Day52 单调栈3的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 算法训练day37|贪心算法 part06(LeetCode738.单调递增的数字)

    题目链接🔥🔥 给定一个非负整数 N,找出小于或等于 N 的最大的整数,同时这个整数需要满足其各个位数上的数字是单调递增。 (当且仅当每个相邻位数上的数字 x 和 y 满足 x = y 时,我们称这个整数是单调递增的。) 示例 1: 输入: N = 10 输出: 9 示例 2: 输入: N = 1234 输出:

    2024年02月09日
    浏览(28)
  • 算法刷题Day 37 单调递增的数字+监听二叉树

    两个可能经常要用到的函数 字符串转数字: to_string() 数字转字符串: stoi() 利用树后续遍历,同时加上状态转移的方法,非常值得反复学习

    2024年02月13日
    浏览(26)
  • 算法打卡day32|贪心算法篇06|Leetcode 738.单调递增的数字、968.监控二叉树

    Leetcode 738.单调递增的数字 题目链接:738.单调递增的数字  大佬视频讲解:单调递增的数字视频讲解  个人思路 这个题目就是从例子中找规律,例如 332,从后往前遍历,32不是单调递增将2变为9,3减1,变成了329,遍历到2,32不是递增,将2变为9,3减1,变成299,符合题目条件,打印

    2024年04月16日
    浏览(31)
  • Day37 贪心算法 part06 738. 单调递增的数字 968. 监控二叉树

    建议二刷巩固

    2024年01月23日
    浏览(30)
  • 算法刷题Day 52 最长递增子序列+最长连续递增子序列+最长重复子数组

    我自己想出来的方法,时间复杂度应该是 O(n2) 滑动窗口 连续的话,可以考虑用滑动窗口 动态规划 贪心算法

    2024年02月14日
    浏览(40)
  • 【LeetCode题目详解】第八章 贪心算法 part06 738.单调递增的数字 968.监控二叉树 (day37补)

    当且仅当每个相邻位数上的数字  x  和  y  满足  x = y  时,我们称这个整数是 单调递增 的。 给定一个整数 n ,返回 小于或等于 n 的最大数字,且数字呈 单调递增 。 示例 1: 示例 2: 示例 3: 提示: 0 = n = 109 # 暴力解法 题意很简单,那么首先想的就是暴力解法了,来我替大家

    2024年02月10日
    浏览(32)
  • 算法 DAY52 动态规划10 1143.最长公共子序列 1035.不相交的线 53. 最大子数组和

    本题和动态规划:718. 最长重复子数组 (opens new window)区别在于这里不要求是连续的了 1、dp数组 dp[i][j]:长度为[0, i - 1]的字符串text1与长度为[0, j - 1]的字符串text2的最长公共子序列为dp[i][j] 2、递推公式 因为不强调是连续的,当前dp[i][j] 就有三种路径可以选:dp[i-1][j] dp[i][j-1]

    2024年02月03日
    浏览(52)
  • day58 单调栈

    使用场景 :通常是一维数组,要寻找任一个元素的右边或者左边第一个比自己大或者小的元素的位置 本质 :空间换时间 三个判断条件 : 当前遍历的元素T[i]小于栈顶元素T[st.top()]的情况 当前遍历的元素T[i]等于栈顶元素T[st.top()]的情况 当前遍历的元素T[i]大于栈顶元素T[st.t

    2024年02月14日
    浏览(28)
  • 9.8day58 单调栈

    739. 每日温度 - 力扣(LeetCode) 知识点:1.建栈                2.如果后面要加入的数小于栈顶元素就把数组的下标压进栈里                 3.反之 就让该数于栈顶元素进行比较 如果该数大于栈顶元素(while) 就把栈顶元素下表对应的arr数组的值进行相应的赋值  否则就

    2024年02月09日
    浏览(22)
  • LeetCode打卡 day58--单调栈

    单调栈的应用, 就是需要构建一个单调递增或者单调递减的栈, 去解决下一个大(小)的元素的问题 题目链接 给定一个整数数组 temperatures ,表示每天的温度,返回一个数组 answer ,其中 answer[i] 是指对于第 i 天,下一个更高温度出现在几天后。如果气温在这之后都不会升高,请

    2024年02月12日
    浏览(29)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包