参考博客: http://blog.csdn.net/doc_sgl/article/details/11805519
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.
Above is a histogram where width of each bar is 1, given height = [2,1,5,6,2,3]
.
The largest rectangle is shown in the shaded area, which has area = 10
unit.
For example,
Given height = [2,1,5,6,2,3]
,
return 10
.
我觉得可以这么想,如果给你一个递增的数组,你怎么计算!
栈用来存索引!height中的下标 , 而且必须是递增的索引!(索引对应的值是必须的)
如果等待进栈的元素的值小于栈顶元素,那么就对栈中大于该值的元素出栈,并计算面积!
这一步,不就是在这一个升序的数组里面,高度大于等待进栈的元素的面积不就已经确定了吗?
比如说,1 , 5 , 6 , 2 ,当元素2的下标等待进栈时,那么高度为 5 或 6 的宽度不就确定了吗 , 一个
为 2 , 一个 为1 ,但是对于高度为1 ,你的宽度可不单单就是3 , 你还可以与2相连 ,宽度为4 ,然后2 后面的元素!
总之,你都要把高度为height[i]的面积算出来,
无论你是O(n^2) 的算法,还是 0(n)的算法
只不过O(n)的算法,它不是想O(n^2)的算法那样,以height[i]开头,然后 i+1 ,i+2....
通过栈,实现了在一个升序的数组里面计算!一次遍历即可!
public class Solution { public int largestRectangleArea(int[] height) { int len = height.length; if(len <= 0 ) return 0; LinkedList<Integer> stack = new LinkedList<>(); int[] extHt = Arrays.copyOf(height ,len + 1); int maxArea = 0; for(int i = 0 ; i < len + 1 ;) { if(stack.isEmpty() || extHt[stack.getLast()] < extHt[i]) stack.add(i++); else { // 栈顶元素>height[i] 出栈 int top = stack.removeLast(); int width = 0; // 注意 如果top 是里面的最后一个元素,那么只有两种可能,一它是最小的元素,而它是第一个元素 // 最小的元素对应的 i 就是 len 第一个元素 对应的i = 1 if(stack.isEmpty()) width = i; // 这个求width的长度可以参照下图 else width = i - stack.getLast() - 1; //这句话的意思,可以理解成 第top 个元素 在他所属的升序子集中的面积! maxArea = Math.max(maxArea , extHt[top] * width); } } return maxArea; } }
我想我知道这中算法为什么是对的了?
如果给你一个递增的数组 : 1 3 5 6 9 12 你会就算!
12 , 9 和 12 = 18 , 6 9 和 12 = 18 ,5 6 9 和 12 = 20 ,3 5 6 9 12 = 20 ......
同样对于 ,一个乱序的数组,乱序中也有顺序 ,比如 2 ,1 ,5 ,6 , 2 ,3
按照上面算法的思路 : 2 1 降序了,可以看成1左边是一个升序的子集,而不是一个元素,那么就按照从后向前
计算最大面积!直到满足1加进来后,又是一个升序的 , 然后又可以这样了吗。
1 , 5 , 6 ,到2的时候,不满足升序了 ! 从后往前 直到 1 .
那么,这里有一个问题,你为什么不连1也一块计算了!
因为1 你 能够和后面的元素 又构成一个新的升序数组,也就是说,与1公共的面积不单单只有这一块!2 , 3 与 1都有公共的面积!
可以想象一个数组的最小元素,那么它的公共面积 是不是 size * min !
相关推荐
在LeetCode这个著名的在线编程挑战平台上,有一道题目名为“Largest Rectangle in Histogram”(直译为“柱状图中的最大矩形”),这是一道与数据结构和算法密切相关的题目,旨在考察程序员对栈、动态规划以及几何...
LintCode - 122. Largest Rectangle in Histogram(直方图最大矩形覆盖)(单调栈)题目链接题目解析主要是运用单调栈(单
http://blog.csdn.net/two_water/article/details/53004027 LeetCode_直方图最大面积(Largest Rectangle in Histogram)
python python_leetcode题解之084_Largest_Rectangle_in_Histogram
javascript js_leetcode题解之84-largest-rectangle-in-histogram.js
c c语言_leetcode题解之0084_largest_rectangle_in_histogram.zip
13.柱状图中最大的矩形(Largest Rectangle in Histogram):给定一个数组,找到柱状图中的最大矩形面积。难度:困难 队列(Queue)是一种先进先出(FIFO)的数据结构,常用于解决任务队列、缓冲区等问题。以下是...
11. 栈与单调栈问题:例如Valid Parentheses(有效的括号)、Largest Rectangle in Histogram(直方图中的最大矩形)等,考察候选人对于栈结构的掌握。 12. 字符串匹配问题:如Wildcard Matching(通配符匹配)、...
1. Introduction ... Largest Rectangle in Histogram ix. Maximal Rectangle x. Palindrome Number xi. Search a 2D Matrix xii. Search for a Range xiii. Search Insert Position xiv. Find Peak Element
Rectangle:单调栈(Histogram变形) Largest Rectangle in Histogram:单调栈 Island Perimeter:简单对比(map+zip的使用) or 遍历查找 Max Area of Island:DFS(本来想用DP,发现出不来) Number of Islands:DFS My ...
- **Largest Rectangle in Histogram**:在直方图中找到最大的矩形面积。 - **Maximal Rectangle**:在二维矩阵中找到最大的矩形。 - **Palindrome Number**:判断一个数字是否是回文数。 - **Search a 2D ...
11. **Largest Rectangle in Histogram** (柱状图中最大的矩形) 求柱状图中能构成的最大矩形面积。可以使用栈来辅助实现,维护当前高度和最大高度。 12. **Maximal Rectangle** (最大的矩形) 在一个01矩阵中找到...
* Largest Rectangle in Histogram:给定一个直方图,返回直方图中的最大矩形面积。这个题目需要使用栈的思想,将直方图中的每个矩形分解成更小的矩形,并找到最大矩形。 * Maximal Rectangle:给定一个矩形,返回...
- **直方图中的最大矩形(Largest Rectangle in Histogram)**: 给定直方图的高度,计算能够组成的矩形的最大面积。 - **最大矩形(Maximal Rectangle)**: 在由'0'和'1'组成的二维矩阵中,找到只包含'1'的最大矩形,并...
421 | [Maximum XOR of Two Numbers in an Array](https://leetcode.com/problems/maximum-xor-of-two-numbers-in-an-array/) | [C++](./C++/maximum-xor-of-two-numbers-in-an-array.cpp) [Python](./Python/...
问题二:直方图中最大的矩形(Largest Rectangle in Histogram) 这是一个经典的几何问题,需要找到直方图(一种特殊形式的柱状图)中可以构成的最大矩形面积。解决这个问题通常采用栈作为辅助数据结构。遍历每个...
如"最宽的水平条"(Largest Rectangle in Histogram)。 5. **前缀和与后缀和**:通过计算数组的累积和,可以快速求解区间和问题。例如"连续子数组的最大和"(Maximum Subarray)。 6. **动态规划**:数组问题常与...
力扣最大面积直方图中最大的矩形 给定 n 个非负整数表示直方图的条形高度,其中每个条形的宽度为 1,求直方图中最大矩形的面积。 上面是一个直方图,其中每个条的宽度为 1,给定高度 = [2,1,5,6,2,3]。...
股票买卖最佳时机leetcode Java项目 这是 Java 项目的存储库。 它包含: 基于回溯的数独求解器。 许多编码面试问题的解决方案作为从InterviewBit 和Leetcode ...Largest_Rectangle_In_Histogram Least_C