leetcode之Largest Rectangle in Histogram
来源:互联网 发布:开车摆摊知乎 编辑:程序博客网 时间:2024/05/25 05:36
原载于http://blog.csdn.net/yanxiangtianji
转载请注明出处
题目:
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
.
暴力:
穷举各个segment,共二分之n平方个(O(n^2)),在每个segment里面找到最小高度(O(n)),可以优化到O(1)。找高度与segment长度之积最大的。
总体时间复杂度为O(n^3),可以优化到O(n^2);空间复杂度O(1)。
class Solution {public: int largestRectangleArea(vector<int> &height) { // Start typing your C/C++ solution below // DO NOT write int main() function unsigned res=0; for(size_t i=0;i<height.size();i++){//end for(size_t j=0;j<=i;j++){//start size_t min_h=0xffffffff; for(size_t p=j;p<=i;p++) min_h=min(min_h,static_cast<size_t>(height[p])); res=max(res,min_h*(i-j+1)); } } return res; }};
优化后(O(n^2)):
class Solution {public: int largestRectangleArea(vector<int> &height) { // Start typing your C/C++ solution below // DO NOT write int main() function unsigned res=0; for(size_t i=0;i<height.size();i++){//start size_t min_h=0xffffffff; for(size_t j=i;j<height.size();j++){//end min_h=min(min_h,static_cast<size_t>(height[j])); res=max(res,min_h*(j-i+1)); } } return res; }};
DP:
目标即为找到最大的l*f(p,l)值。其中p=1...n;l=1...p。
状态转移方程:
f(p,l) = 当l不为1:min( f(p-1,l-1), height[p] )
当l为1:height[p]
时间复杂度O(n^2);空间复杂度为O(n^2),考虑到只是用了f(p-1,*),空间可以压缩到O(n)。
具体压缩方法(用dp表示f):
去掉p这个维度,l从大到小迭代,此时访问dp[l-1]即为访问f(p-1,l-1)。
class Solution {public: int largestRectangleArea(vector<int> &height) { // Start typing your C/C++ solution below // DO NOT write int main() function vector<unsigned> dp; dp.reserve(height.size()+1); dp[0]=0xffffffff; unsigned g_max=0; for(size_t i=0;i<height.size();i++){//i is end position for(size_t l=i+1;l>0;l--){//l is length dp[l]=min(dp[l-1],static_cast<unsigned>(height[i])); g_max=max(dp[l]*l,g_max); } } return g_max; }};
- leetcode之Largest Rectangle in Histogram
- leetcode之Largest Rectangle in Histogram
- LeetCode之Largest Rectangle in Histogram
- leetcode之Largest Rectangle in Histogram
- LeetCode: Largest Rectangle in Histogram
- LeetCode Largest Rectangle in Histogram
- LeetCode: Largest Rectangle in Histogram
- [Leetcode] Largest Rectangle in Histogram
- [LeetCode] Largest Rectangle in Histogram
- [Leetcode] Largest Rectangle in Histogram
- [leetcode] Largest Rectangle in Histogram
- [LeetCode]Largest Rectangle in Histogram
- Leetcode: Largest Rectangle in Histogram
- [leetcode]Largest Rectangle in Histogram
- Leetcode:Largest Rectangle in Histogram
- LeetCode-Largest Rectangle in Histogram
- LeetCode Largest Rectangle in Histogram
- [LeetCode] Largest Rectangle in Histogram
- 手动清除CRS信息
- linux NTP 配置时间同步
- struts2 set 标签的自身引用
- leetcode简介
- How to install DHCP server on Windows Server 2008R2
- leetcode之Largest Rectangle in Histogram
- Cocos2d-x学习之windows 7的visual studo 2010开发环境安装
- Sybase ASE15.x中启用跟踪SQL语句的方法
- 32位与64位操作系统的区别
- 使用ant编译、运行junit、以及检查编码
- 如何使用ant从多个Source Folder的项目中导出jar包?
- denim1: sum of subsets
- 公司ios开发者账号申请
- Opportunistic Network Environment 模拟器入门指导