给定一个整数数组,表示站在地面上的相邻垂直条的高度。
每个杆的宽度为1.现在你必须选择两个杆并移除它们之间的杆,这样当下雨时,两个杆之间收集的水是最大的。请注意,移除剩余的条后,条之间的距离保持不变。
例如:
1。 [10,5,6,12,14] ans:30(10 * 3)
2。 [3 16 10 5 6 12 20 18] ans:80(16 *(16和18之间的整数))。
有一个天真的O(N 2 )解决方案,但我们可以做得更好吗?
答案 0 :(得分:6)
使用堆栈可以解决这个问题,但是使用两个指针方法有一个更好更简单的解决方案。
这是伪代码:
result := 0
left := 0
right := n - 1
while(left < right):
result := max(result, (right - left - 1) * min(arr[left], arr[right]))
if(arr[left] <= arr[right]):
left := left + 1
else:
right := right - 1
endif
end
从酒吧的最左边和最右边的位置开始,并根据一些决定逐渐走向相反的方向,直到两个指针没有相互交叉。
当arr[left] <= arr[right]
时,我们会向右移动left := left + 1
,因为无法获得更好的高度保持arr[left]
作为左边界。如果在这种情况下我们将right := right - 1
向左移动,则宽度将减小而宽度将会减小时,将无法获得更大的宽度区域,而高度仍为arr[left]
。
arr[right] < arr[left]
的类似逻辑。
时间复杂度为O(n)
,空格为O(1)
。
希望它有所帮助!