0%

leetcodeP11-ContainerWithMostWater

这道题以前做过,但是忘记怎么做的了。第一次交了一个双重循环的暴力。查看题解一下就明白了正确的贪心算法。

题目描述

给你 N 个非负的正整数 a1,a2,a3,…an,每个代表了坐标轴上的一个点(i,ai)。n 条垂直的线连接点和 x 轴,要求找出两条线,让它们和 x 轴组成的容器的容积最大。

解题思路

正解是用两点逼近的算法。首先容器的高度是由最短的那条线决定的。
维护一个变量记录最大容积。记录所取的两端的端点位置,每次计算当前情况的容积,并更新最大容积。之后更新较短的那条线的端点位置(一定是更新较短的端点位置,否则容积一定小于当前容积,因为只有宽度减小),更新方法为向另一端的方向遍历直到遇到一条比当前线高度高的线(比当前线高度低的线组成的容积一定小于当前情况的容积)。

以下是代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
func maxArea(height []int) int {
left, right := 0, len(height)-1
res := 0
for left < right {
minHeight := 0
if height[left] < height[right] {
minHeight = height[left]
} else {
minHeight = height[right]
}

newArea := (right - left) * minHeight
if newArea > res {
res = newArea
}

if height[left] < height[right] {
newLeft := left + 1
for newLeft < right && height[newLeft] < height[left] {
newLeft = newLeft + 1
}
left = newLeft
} else {
newRight := right - 1
for newRight > left && height[newRight] < height[right] {
newRight = newRight - 1
}
right = newRight
}
}
return res
}