algorithm - 如何优化解决方案以获得线性性能以找到直方图的孔总面积?

标签 algorithm performance optimization

所以问题是,给定一个直方图,找出直方图可以容纳的水的总面积,如果直方图是三个大小分别为 5、3、5 的条,那么它可以容纳的水的总面积是 2,因为直方图只能在第二个条 (3) 的顶部保持水,因为它的相邻条较大,形成一个洞。超过 2 个,水就会从侧面流出。更多示例:

我:[5 2 3 2 4] 奥:5

我:[2 5 1 4 7 3 1 5 1] O: (4 + 1) + (2 + 4) = 11 第2条和第5条之间、第5条和第8条之间有孔

我的解决方案是一种采用 O(n^2) 的蛮力解决方案,其中对于每个单独的条形图,您可以在该条形图的右侧和左侧找到最大值的最小值,并求出它们之间的差异min-max bar 和当前 bar 以获得该 bar 上的水量。依此类推,直到您通过所有栏。

您将如何优化它以获得线性性能?

最佳答案

构建两个数组,分别保存当前数组左右​​两侧的最大元素(包括自身)。您可以在线性时间内构建它们中的每一个。 对于您的示例:

left: [5 5 5 5 5]
right: [5 4 4 4 4]

现在再次运行原始输入并对 min(left[i], right[i]) - I[i] 求和。由于现在查找最大值只是一次查找,因此整个算法的复杂度为 O(N)。

您可以证明这是正确的,因为对于位置 i,如果您可以将水位提高到更高的水平,则至少需要在该水位的左右两侧设置屏障。由于您已经使用了 max from left 和 max from right,因此没有比您已经选择的更高的障碍了。

关于algorithm - 如何优化解决方案以获得线性性能以找到直方图的孔总面积?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34088020/

相关文章:

JavaScript 堆大小和 Chrome 增加

c++ - 掷硬币游戏 : Optimization problem

sql - 将平面表解析为树的最有效/优雅的方法是什么?

arrays - 算法将数组拆分为子数组,其中所有子数组之间的最大总和尽可能低

javascript - 我应该如何最好地搜索根据特定元素的 id 动态生成的自定义列表?

sql - 我怎样才能摆脱这个查询中的 'ORA-01489: result of string concatenation is too long' ?

c - 在 GCC 进行的每次优化后获取汇编代码?

algorithm - 二叉索引树实现,以便计算给定区间内小于给定数字的整数个数?

java - 打印二进制排列列表

.net - Azure 表存储性能 - REST 与 StorageClient