84.Largest Rectangle in Histogram
2016-04-20 11:02
197 查看
题目: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.
这是我的代码,测试了几个数据,结果是正确的。但是提交代码后,发现当测试数据的规模太大的时候,运行时间太长。下面简要说明我的代码的思路:使用遍历的思路,求出所有可能的面积,然后得到面积的最大值。求面积的思路是对于每一个给定的高度,确定相应的矩形左右边界。优点是容易理解,当然代价是计算复杂度高。
对于这个问题下面给出Discuss区的一个代码段:
该代码的优点是不断更新最大面积值,而不是先求得所有可能的面积值,再得到最大面积值。该代码的核心是:保证
注意事项:
pop_back() 删除vector 数据的最后一个元素,并且数据的规模减1;
back() 返回vector 数据最后一个元素的引用。
int largestRectangleArea(vector<int>& heights) { if(heights.empty()) return 0; //给heights两边补零 vector<int> new_heights; vector<int> area; new_heights.push_back(-1); for(int i=0;i<heights.size();i++) new_heights.push_back(heights[i]); new_heights.push_back(-1); for(int i=0;i!=heights.size();i++) { vector<int> line_labels; vector<int> line_width; for(int j =1;j!=new_heights.size()-1;j++) { if(new_heights[j]>=heights[i] && new_heights[j-1]<heights[i]) { line_labels.push_back(j); } if(new_heights[j]>=heights[i] && new_heights[j+1]<heights[i]) { line_labels.push_back(j); } } vector<int> temp; for(int i=0;i!=line_labels.size();i+=2) { temp.push_back(line_labels[i+1]-line_labels[i]+1); } int max_line=*max_element(temp.begin(),temp.end()); area.push_back(heights[i]*max_line); } int result=*max_element(area.begin(),area.end()); return result; }
这是我的代码,测试了几个数据,结果是正确的。但是提交代码后,发现当测试数据的规模太大的时候,运行时间太长。下面简要说明我的代码的思路:使用遍历的思路,求出所有可能的面积,然后得到面积的最大值。求面积的思路是对于每一个给定的高度,确定相应的矩形左右边界。优点是容易理解,当然代价是计算复杂度高。
对于这个问题下面给出Discuss区的一个代码段:
int largestRectangleArea(vector<int> &height){ int ret=0; height.push_back(0); vector<int> index; for(int i=0;i!=height.size();i++) { while(index.size() && height[index.back()]>=height[i]) { int h=height[index.back()]; index.pop_back(); int sidx=index.size()>0 ? index.back() : -1; if(h*(i-1-sidx)>ret) ret=h*(i-1-sidx); } index.push_back(i); } return ret; }
该代码的优点是不断更新最大面积值,而不是先求得所有可能的面积值,再得到最大面积值。该代码的核心是:保证
index.size()>0 && height[index.back()]>=height[i]
注意事项:
pop_back() 删除vector 数据的最后一个元素,并且数据的规模减1;
back() 返回vector 数据最后一个元素的引用。
相关文章推荐
- 怎么SDCard上的获取相册照片
- Python中urlretrieve函数
- Cocos2d-JS 加速度计与加速度事件
- java启动tomcat报错问题
- App架构设计经验谈:接口的设计
- android 容器还没初始化完毕加载数据没显示
- HDU 1796 How many integers can you find
- java.lang.ClassNotFoundException: Didn't find class "com.example.b.MainActivity
- Ionic环境配置问题记录
- 机器学习实战之PCA
- list_01
- Android 多线程-----AsyncTask详解
- Asp.net(C#)读取数据库并生成JS文件制作首页图片切换效果(附demo源码下载)
- HTTP对外接口,如何增加签名机制
- VMware虚拟机下CentOS无法上网解决方法
- 线程相关
- 深入浅出JMS(一)--JMS基本概念
- 判断二叉树是否相等
- Git远程操作详解
- 你为什么老是找不到满意的工作? 多思考自己的原因 !