支线任务-3

Largest Rectangle in Histogram

Given n non-negative integers representing the histogram‘s bar height where the width of each bar is 1, find the area of largest rectangle in the histogram.

大概形如上图所示。5,6构成的就是所求的最大矩形区域。题目简单暴力。

开始先写个朴素的O(N^2)算法,发现果然过不了。。。

其实隐约的感觉到应该是要快速的找出第一个比第 i 位矮的位置在哪里,然后通过(右边的位置减去左边的位置)*height[i] 得到第 i 位的答案,这样答案就在O(N)内可以计算出来。

只要得到了这个window数组,答案就显而易见了。只需求出Max(window[i] * height[i])就可以了。

然后有了一点类似kmp那样重复利用已有信息的想法,可是还是不太清楚具体要怎么实现。

直到手贱点开了tag,看到了其中的stack才恍然大悟。(虽然后面发现不用显示的写出这个栈貌似复杂度也是一样的)

我最初的方法是:

每次进栈的时候直到栈顶不高于当前高度为止弹栈,当前元素的前一个即是栈顶,然后压入当前元素。

复杂度分析:每个位置只会进栈一次出栈一次,再加上刚刚得到最终结果的分析。所以总的复杂度是严格O(N)的,提交发现AC了。

代码如下:

class Solution {
public:
    int largestRectangleArea(vector<int>& height) {
        stack<int> backward, forward;
        int *window = new int[height.size()];
        for (int i = 0; i < height.size(); i++)
        {
            window[i] = 1;
        }
        for (int i = 0; i < height.size(); i++)
        {
            int j = height.size() - i - 1;
            while (!forward.empty() && height[forward.top()] >= height[i])
            {
                forward.pop();
            }
            window[i] += forward.empty() ? i : i - forward.top() - 1;
            forward.push(i);
            while (!backward.empty() && height[backward.top()] >= height[j])
            {
                backward.pop();
            }
            window[j] += backward.empty() ? height.size() - j - 1 : backward.top() - j - 1;
            backward.push(j);
        }
        int max = 0;
        for (int i = 0; i < height.size(); i++)
            max = max < window[i] * height[i] ? window[i] * height[i] : max;
        return max;
    }
};
时间: 2024-10-20 21:30:47

支线任务-3的相关文章

支线任务8-Find Median from Data Stream(中位数问题)

一.题目描述 Median is the middle value in an ordered integer list. If the size of the list is even, there is no middle value. So the median is the mean of the two middle value. Examples: [2,3,4] , the median is 3 [2,3], the median is (2 + 3) / 2 = 2.5 Des

数据结构与算法(1)支线任务4——Lowest Common Ancestor of a Binary Tree

题目如下:https://leetcode.com/problems/lowest-common-ancestor-of-a-binary-tree/ Given a binary tree, find the lowest common ancestor (LCA) of two given nodes in the tree. According to the definition of LCA on Wikipedia: “The lowest common ancestor is def

支线任务-4

Lowest Common Ancestor of a Binary Tree Given a binary tree, find the lowest common ancestor (LCA) of two given nodes in the tree. According to the definition of LCA on Wikipedia: “The lowest common ancestor is defined between two nodes v and w as th

支线任务8——寻找中位数

题目描述 用以下的一个类实现两个函数 void addNum(int num) - Add a integer number from the data stream to the data structure. double findMedian() - Return the median of all elements so far. class MedianFinder { public: // Adds a number into the data structure. void add

数据结构与算法(1)支线任务8——Find Median from Data Stream

题目如下:(https://leetcode.com/problems/find-median-from-data-stream/) Median is the middle value in an ordered integer list. If the size of the list is even, there is no middle value. So the median is the mean of the two middle value. Examples: [2,3,4] 

支线任务5

题目:The Skyline Problem A city's skyline is the outer contour of the silhouette formed by all the buildings in that city when viewed from a distance. Now suppose you are given the locations and height of all the buildings as shown on a cityscape photo

支线任务2-Basic Calculator

问题描述: 题目要求我们实现一个简单的加减计算器,计算一个表达式的值,表达式除了数字之外还可能会含有括号,加减符号以及空格. 思路: 其实看到这个题自然就会想到利用后缀式求表达式值的算法作业题,况且这个题还没有乘法除法运算,我就沿用了做算法作业题的思路来求解: 1.由原表达式求出后缀式 2.根据后缀式求值 当然,这个题由于没有乘除法,不需要考虑运算符的优先性而只需要考虑括号的分隔作用,相比于算法作业有很多地方可以简化:比如新的一个运算符号遇到栈顶符号时可以直接拿出栈顶符号,又比如在栈里在'('之

支线任务-Python爬虫

五一小长假要到了,甄开心,肯定比写博客要开心多了,哈哈哈哈 我还在犹豫要不要写爬虫这篇,因为网上已经有大量爬虫相关资源,爬虫也不是以研究为主,而是一个获取数据的手段. 书写目的: 数据数量和质量对你运行模型的效果有着重要影响: 如果数据购买昂贵又没有现成数据下载,不论个人还是公司都会首选爬虫: 不需要深入爬虫知识(比如Scrapy爬虫工程),就可以获取大部分网站数据: 装包提示: 装包用pip install XXX,Baidu一下有很多指导帖 学会Baidu谷歌能够让你在之后的路上走得更远更自

编程入门指南

前言 如今编程成为了一个越来越重要的「技能」:作为设计师,懂一些编程可能会帮你更好地理解自己的工作内容:作为创业者,技术创始人的身份则会让你的很多工作显得更容易.而作为刚想入门的新手,面对眼前海量的信息,或许根本不知道从哪里开始:入门轻松度过初级材料的学习后,发现学习越来越困难,陡峭的学习曲线又让你望而却步:你知道如何在页面上打印输出一些文本行,但是你不知道何时该进行一个真正的有用的项目:你不清楚自己还有哪些不知道的东西,你甚至搞不清下一步该学什么. 这篇文章的内容对此不仅会有一些方向性的建议,