Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 如何优化解决方案以获得线性性能,从而找到直方图';s洞的总面积?_Algorithm_Performance_Optimization - Fatal编程技术网

Algorithm 如何优化解决方案以获得线性性能,从而找到直方图';s洞的总面积?

Algorithm 如何优化解决方案以获得线性性能,从而找到直方图';s洞的总面积?,algorithm,performance,optimization,Algorithm,Performance,Optimization,所以问题是,给定一个柱状图,求出柱状图可以容纳的水的总面积,如果柱状图是三个大小分别为5、3、5的条形图,那么它可以容纳的水的总面积是2,因为柱状图只能容纳第二个条形图(3)顶部的水,因为它的相邻条形图更大,形成了一个洞。如果超过2,水就会从侧面流出。更多示例: I:[5 2 3 2 4] O:5 I:[2 5 1 4 7 3 1 5 1] O:(4+1)+(2+4)=11 杆2和杆5之间以及杆5和杆8之间有孔 我的解是一种蛮力解,取O(n^2),其中对于每一根棒,你可以在棒的左右两侧找到最大值

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

I:[5 2 3 2 4] O:5

I:[2 5 1 4 7 3 1 5 1] O:(4+1)+(2+4)=11 杆2和杆5之间以及杆5和杆8之间有孔

我的解是一种蛮力解,取O(n^2),其中对于每一根棒,你可以在棒的左右两侧找到最大值的最小值,然后得到最小最大值和当前棒之间的差值,得到这根棒上的水含量。等等,直到你通过所有的酒吧


您将如何对此进行优化以获得线性性能?

构建两个阵列,在当前阵列(包括其自身)的左右两侧保留最大的元素。您可以在线性时间内构建它们中的每一个。 例如:

left: [5 5 5 5 5]
right: [5 4 4 4 4]
现在再次运行原始输入和sum
min(左[i],右[i])-i[i]
。因为现在查找最大值只是一个查找,所以整个算法是O(N)


你可以证明这是正确的,因为对于一个位置i,如果你能把水位提高到更高的水平,你至少需要在该水平的左右两侧设置一个屏障。由于您已经使用了从左到右的最大值和从右到右的最大值,因此没有比您已经选择的更高的障碍。

迭代输入数组,将每个元素及其位置添加到堆栈中。但在添加任何元素之前,先移除之前的任何较小元素,然后计算出在k处的z和i处的x之间,底部j处的y将填充多少水

请注意,即使必须为每个元素执行从堆栈中移除元素的循环,这仍然是O(n),因为每个元素都将进入和退出堆栈一次

下面是一个Python代码示例:

从集合导入数据
def解决方案(A):
答案=0
Q=deque()
对于枚举(A)中的i,x:
而len(Q)和Q[-1][1]
我想知道的是,你们如何找到线性时间内左右最大元素的数组?这就是我遇到的问题with@AadeshP向左迭代一次。Iterarate一次向后为右,然后再次迭代为最终结果。即使迭代次数固定,它仍然是线性的。