题目链接:
https://leetcode.cn/problems/container-with-most-water/
package leetcode
func maxArea(height []int) int {
max, start, end := 0, 0, len(height)-1
for start < end {
width := end - start
high := 0
if height[start] < height[end] {
high = height[start]
start++
} else {
high = height[end]
end--
}
temp := width * high
if temp > max {
max = temp
}
}
return max
}
为什么当height[start]
< height[end]
,需要将start++
,难道不存在一个最优解是以start为左边边界的么?
白话文反证法:当height[start]
< height[end]
,假设存在一个最优解,是以start为左边界,其右边界的索引为i, i<end
(因为是从两边向中间移动)
当height[i] < height[start]
, 根据height[start]
< height[end]
,可以得到height[i] < height[start]
< height[end]
,所以start,end
为边界的结果肯定大于start,i
的结果。
当height[i] > height[start]
,又因为height[start]
< height[end]
,所以start所在的柱子是最矮的,水最多只能到height[start]
的地方,又因为 i < end
,所以一定是以end
作为右边界的结果比较大。
因此假设不存在,因此height[start]
< height[end]
,需要将start++
关联目标:双指针刷题 1/76