algorithm - 如何优化我对 HackerRank 的最大矩形问题的解决方案?
问题描述
我正在尝试在 python 中解决 HackerRank ( https://www.hackerrank.com/challenges/largest-rectangle/problem ) 上的最大矩形问题。
在一定的二维景观中有许多建筑。每个建筑物都有一个高度,由 给出
h[i]
。如果您连接k
相邻的建筑物,它们将形成一个面积为 的实心矩形k * min(h[i], h[i + 1], ..., h[i + k - 1])
。例子
h = [3, 2, 3]
可以在边界内构建一个高度
h = 2
和长度的矩形。k = 3
形成的区域是h * k = 2 * 3 = 6
。
我得到了以下代码的次优解决方案:
def area(h, i_start, k):
return k*min(h[i_start:i_start+k])
def largestRectangle(h):
largestArea = 0
for i_start in range(len(h)):
for k in range(1,len(h)-i_start+1):
thisArea = area(h, i_start, k)
if thisArea > largestArea:
largestArea = thisArea
return largestArea
虽然这适用于许多较小的测试用例,但它在较大的测试用例上会超时;我相信它是 O(n^2),其中 n 是 h 的长度。
我想得到一个更快的版本,但我不知道如何避免检查所有宽度 k。实际上,如果在某个点之后,h 的下降幅度很小,我们希望矩形尽可能宽,但如果下降更快,那么我们就不应该扩大矩形。有没有人有可能的提示?
解决方案
推荐阅读
- sql-server - 有没有办法在 SQL Server 2005 中检索正确的视图定义?
- java - 查看 PWA - 没有“添加到主屏幕”按钮 CHROME
- generator - Python:AttributeError:“生成器”对象没有“读取”属性
- macos - ZSH PATH 变量条目在 OS X Catalina 上是向后的
- python - 我们可以在 python 中使用逻辑回归预测数据集的未来值吗?
- http - 通过 HTTP 调用 AWS Lambda 函数
- javascript - 使用 Promise.all 删除所有 id
- c - 打包位并读取它们 - C
- html - 我的复选框或单选按钮没有正确对齐?
- vb6 - 如何在任何地方获取 VBScript 的返回值到自动化?