给你 n 个非负整数 a1,a2,…,an,每个数代表坐标中的一个点 (i, ai) 。在坐标内画 n 条垂直线,垂直线 i 的两个端点分别为 (i, ai) 和 (i, 0)。找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。
//
说明:你不能倾斜容器,且 n 的值至少为 2。
//
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/container-with-most-water
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
这道题本质是求面积。假设容器一开始具有最大的宽度0到(len-1),但是两边不固定。如果容器较短的一边不变,即使另一条边再高,也无法扩大面积,即容器的短板会限制面积改变。所以从短板那一边开始往中间选择新的边,只有这个方向才存在求得更大面积的可能性。求出最大面积只需一次遍历。
func maxArea(height []int) int {
max, temp, guard := 0, 0, 0
for l, r := 0, len(height)-1; l < r; {
guard = int(math.Min(float64(height[l]), float64(height[r])))
temp = (r - l) * guard
if temp > max {
max = temp
}
if height[l] <= height[r] {
for l++; l < r && guard >= height[l]; l++ {
}
} else if height[l] > height[r] {
for r--; l < r && guard >= height[r]; r-- {
}
}
}
return max
}
2020年6月26日修改,增设一个guard,当计算结果不比max大的时候,可以当遍历条件的参考值,避免重复计算比guard小的情况。