为什么这两个循环没有给我相同的结果以及如何降低时间复杂度?



我想解决这个问题,但这不是我的问题。我只是把它作为上下文。

"给定一个长度为n的整数数组高度。绘制了n条垂直线,使第i条线的两个端点分别为(i,0(和(i,height[i](。

找到两条与x轴一起形成容器的线,这样容器中包含的水最多。

返回容器可储存的最大水量"上述垂直线由阵列[1,8,6,2,5,4,8,3,7]表示。在这种情况下,容器可容纳的水的最大面积(蓝色部分(为49。

我做了一个简单的嵌套for循环来解决这个问题:

for i in range(0, len(height)):
for j in range(0, len(height)):
maxim = max(min(height[i], height[j]) * abs(j - i),maxim)

但对于更大的阵列来说,此解决方案花费的时间太长。所以我试着用列表理解:来做这件事

mxm = [min(height[i], height[j] * abs(j - i)) for i in range(0, len(height)) for j in range(0, len(height))]
maxim = max(mxm)

问题是,我有两个不同的输出:嵌套的for循环有效(它返回49(,但第二个返回8。(mxm数组包含以下元素:[0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 6, 4, 8, 8, 8, 8, 8, 2, 6, 0, 2, 6, 6, 6, 6, 6, 2, 2, 2, 0, 2, 2, 2, 2, 2, 4, 5, 5, 2, 0, 4, 5, 5, 5, 4, 4, 4, 4, 4, 0, 4, 4, 4, 6, 8, 8, 6, 8, 4, 0, 3, 8, 3, 3, 3, 3, 3, 3, 3, 0, 3, 7, 7, 7, 7, 7, 7, 7, 3, 0](

为什么它们不同?如何使解决方案更快?

在第一个例子中,您将min函数仅应用于高度值

min(height[i], height[j])

在第二个例子中,你也将索引位置之间的绝对距离包括在最小函数中,它将始终应用于高度[j],而不是实际的最小值。

min(height[i], height[j] * abs(j - i))

关于你的解决方案,我相信我以前见过这个问题。我想你要找的是一扇滑动窗户。

最新更新