Question

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 heights = [2,1,5,6,2,3],

return 10.

Solution 1

动态规划,但是会超时。

Code 1

class Solution {
public:
int largestRectangleArea(vector<int>& heights) {
int num = heights.size();
if (num == 0)
return 0;
vector<vector<int>> min_heights(num, vector<int>(num, 0));
vector<vector<int>> max_areas(num, vector<int>(num, 0));
for (int i = 0; i < num; i++) {
min_heights[i][i] = heights[i];
max_areas[i][i] = heights[i] * 1;
}
for (int i = 2; i <= num; i++) {
for (int j = 0; j <= num - i; j++) {
min_heights[j][j + i - 1] = min(heights[j], min_heights[j + 1][j + i - 1]);
max_areas[j][j + i - 1] = max(min_heights[j][j + i - 1] * i, max_areas[j + 1][j + i - 1]);
max_areas[j][j + i - 1] = max(max_areas[j][j + i - 1], max_areas[j][j + i - 2]);
}
} return max_areas[0][num - 1];
}
};

Solution 2

同样是动态规划,但是这次只需要记录之前的比自己低的坐标值。然后遍历之前比自己低的坐标值,每个低的都计算一次面积,具体看代码实现。

Code 2

class Solution {
public:
int largestRectangleArea(vector<int> &height) {
// 记录比自己低的index
int res = 0;
height.push_back(0);
vector<int> index;
for (int i = 0; i < height.size(); i++) {
// 遍历所有比当前高度高的值,这也就是为什么会在height后面插入0的原因
while (index.size() > 0 && height[index.back()] >= height[i]) {
int h = height[index.back()];
index.pop_back(); // 这个是为了计算宽度值
int idx = index.size() > 0 ? index.back() : -1;
if (h * (i - idx - 1) > res)
res = h * (i - idx - 1);
}
index.push_back(i);
}
return res;
}
};

最新文章

  1. loadrunner json
  2. java常用基础知识点 (持续追加)
  3. 解决 502、504 Gateway Time-out(nginx)
  4. NSMutableAttributedString 的使用
  5. REST API出错响应的设计
  6. mtd零星记录
  7. HTML页面关键词随机分布布局
  8. CocoStudio基础教程(6)使用CocoStudio编辑帧事件并关联到程序
  9. 获取客户端ip并用正则表达式验证
  10. 团队项目NABC分析
  11. iOS开发——UI_swift篇&amp;UITableView实现索引功能
  12. Linux上安装Squall
  13. [ES6] Function Params
  14. linux命令:find
  15. Powerdesigner 连接mysql 在指定的DSN中,驱动程序和应用程序之间的体系结构不匹配 SQLSTATE = IM014
  16. 判断字符串中是否包含指定的内容&amp;&amp;字符串截取方法比较说明
  17. JS的事件绑定、事件流模型
  18. 关于定时脚本crontab的坑
  19. CUDA Fortran for Scientists and Engineers第二版翻译
  20. Spring Boot中使用Redis数据库

热门文章

  1. [iOS微博项目 - 4.2] - 设置转发微博背景
  2. shell (check return of each line)(PIPESTATUS[@])and sudoer
  3. d3.js:数据可视化利器之 修改文档:DOM操作符
  4. https://zh.cppreference.com 和 https://en.cppreference.com 和 https://cppcon.org/
  5. leadecode 2 Add Two Numbers
  6. Period II---fzu1901(Next数组)
  7. 【opencv入门篇】快速在VS上配置opencv
  8. Linux系统性能调优之性能分析
  9. mysql不乱码的思想总结
  10. Linux中的yum的配置以及常见报错的处理