博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Largest Rectangle in Histogram
阅读量:7260 次
发布时间:2019-06-29

本文共 1299 字,大约阅读时间需要 4 分钟。

题解


题目描述

Largest Rectangle in Histogram

即寻找序列S中最大的连续子序列矩形面积。连续子序列s矩形面积定义:min{s[i]|0<i<=len(s)} * len(s)
如:S=[2,1,5,6,2,3],最大的连续子序列矩形面积10,此连续子序列s=[5,6]

题解

遍历所有连续子序列并计算其矩形面积,而后取最大值即可。时间复杂度为O(n^2),空间复杂度为O(1)。但存在重复计算,可对此部分进行优化。转化成另一种形式的遍历:对每个可能的min{s[i]|0<i<=len(s)}进行遍历。而后取此时满足条件的最大len(s)即可。前者即序列的每个取值S[i](0<i<=len(S)),最大len(s)=Right - Left - 1Right满足(S[Right] < S[i] && Right > i)Left满足(S[Left] < S[i] && Left < i)。设置标兵:S[0] = S[len(S) + 1] = min{S[i]|0<i<=len(S)} - 1。利用栈保存状态,时间复杂度为O(n),空间复杂度为O(n)

代码

typedef unsigned int uint;static const uint MAX_SIZE = 0x8000;static uint keep[MAX_SIZE];class Solution {public:    int largestRectangleArea(vector
& heights) { size_t len = heights.size(), keepEnd = 0, rect = 0; for (keep[0] = len; len--; keep[++keepEnd] = len) { uint tmp = heights[len], pos = keep[keepEnd]; while (keepEnd) { uint area = heights[pos]; if (tmp >= area) break; pos = keep[--keepEnd]; if ((area *= (pos - len - 1U)) > rect) rect = area; } } while (keepEnd) { uint area = heights[keep[keepEnd]]; if ((area *= keep[--keepEnd]) > rect) rect = area; } return rect; }};

总结

主要应用了等价转化的思想。

转载地址:http://lakdm.baihongyu.com/

你可能感兴趣的文章
《Programming in Lua 3》读书笔记(十四)
查看>>
PBOC~PPT-补充A(转)
查看>>
项目中经常使用的JS方法汇总,非常有用
查看>>
Nginx 1.5.2 + PHP 5.5.1 + MySQL 5.6.10 + Phalcon + Thrift + Composer在 CentOS 下的编译安装
查看>>
jQuery中工厂函数
查看>>
nexus 3上次jar包
查看>>
openstack oslo.messaging库
查看>>
探索c#之不可变数据类型
查看>>
python字符串操作
查看>>
模式对话框,非模式对话框,reject和accept()槽函数确定对话框的返回值
查看>>
【转载】httpContext里面的东西
查看>>
iOS证书(.p12)和描述文件(.mobileprovision)的导出和使用方法
查看>>
Comware 架构理解
查看>>
php抽象类和抽象方法
查看>>
得到输入内容的首字母
查看>>
sklearn特征选择和分类模型
查看>>
设计模式_桥梁模式
查看>>
设计模式C++实现——工厂方法模式
查看>>
语言数据类型
查看>>
Sql 解析XML 解决方案
查看>>