LeetCode | Largest Rectangle in Histogram
2013-12-15 16:48
232 查看
题目:
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 =
10unit.
For example,
Given height =
[2,1,5,6,2,3],
return
10.
思路:
思路1:两层循环,依次计算可能组成的方形面积。时间复杂度较高。
思路2:
一次遍历完成计算,从前一个方形遍历后一个方形时有三种情况。
1)前一个方形的高度等于后一个方形,显然应当取两者合并的面积。
2)前一个方形的高度小于后一个方形,可能取前一个方形与后一个方形组成的方形面积,也可能重后一个方形开始重新构造方形。
3)前一个方形的高度大于后一个方形,可能以后一个方形的面积向前取最大的方形面积。
由于要记录可能开始的方形位置与其高度,我采用了堆来实现。
代码:
思路1:class Solution { public: int largestRectangleArea(vector<int> &height) { int max=0; for(int i=0;i<height.size();i++) { for(int j=i;j<height.size();j++) { int cur = area(height, i, j); if(cur > max) max = cur; } } } int area(vector<int> &height, int i, int j) { return (height[i]<height[j]?height[i]:height[j])*(j-i+1); } };
思路2:
class Solution { public: int largestRectangleArea(vector<int> &height) { if(height.size()==0) return 0; stack<int> indexstack; stack<int> heightstack; int max=0; indexstack.push(0); heightstack.push(height[0]); for(int i=1;i<height.size();i++) { int top = heightstack.top(); if(top < height[i]) { indexstack.push(i); heightstack.push(height[i]); } else if(top > height[i]) { int index = i; while(top>height[i]) { index = indexstack.top(); int area = top*(i-index); heightstack.pop(); indexstack.pop(); if(area>max) max = area; if(heightstack.size()==0) break; else top = heightstack.top(); }; indexstack.push(index); heightstack.push(height[i]); } } while(heightstack.size()>0) { int h = heightstack.top(); heightstack.pop(); int index = indexstack.top(); indexstack.pop(); int area = h * (height.size()-index); if(area>max) max = area; } return max; } };
相关文章推荐
- [LeetCode] Largest Rectangle in Histogram
- leetcode 日经贴,Cpp code -Largest Rectangle in Histogram
- [leetcode刷题系列]Largest Rectangle in Histogram
- [leetcode] Largest Rectangle in Histogram
- [LeetCode] Largest Rectangle in Histogram 解题报告
- LeetCode84 Largest Rectangle in Histogram
- LeetCode--Largest Rectangle in Histogram
- leetcode_题解_Largest Rectangle in Histogram
- [LeetCode][Java] Largest Rectangle in Histogram
- [LeetCode]84 Largest Rectangle in Histogram
- LeetCode 84 Largest Rectangle in Histogram (单调栈)
- leetcode 84 Largest Rectangle in Histogram
- [Leetcode]Largest Rectangle in Histogram - 非递减栈(递增及相等)
- Java for LeetCode 084 Largest Rectangle in Histogram【HARD】
- leetcode || 84、Largest Rectangle in Histogram
- [leetcode] Largest Rectangle in Histogram
- leetcode:Largest Rectangle in Histogram
- leetcode_question_84 Largest Rectangle in Histogram
- LeetCode: Largest Rectangle in Histogram [084]
- [LeetCode] Largest Rectangle in Histogram