11. Container With Most Water
Area 由宽度和高度决定,宽度是 2 条线的差,高度是当前 2 个指针的 min。
Brute Force
列出所有组合。
Time Complexity:
Space Complexity:
Python Implementation
class Solution:
def maxArea(self, height: List[int]) -> int:
m = 0
for i in range(len(height)):
for j in range(len(height)):
if j > i:
l = j - i
h = min(height[i], height[j])
area = l * h
if area > m: m = area
return m
Golang Implementation
func maxArea(height []int) int {
max_so_far := 0.0
for i := 0; i < len(height); i++ {
for j := 0; j < len(height); j++ {
height := math.Min(float64(height[i]), float64(height[j]))
width := j - i
vol := height * float64(width)
max_so_far = math.Max(max_so_far, vol)
}
}
return int(max_so_far)
}
双指针,greedy
指针分别放在两端不断向中心靠近。
Time Complexity: 只需 iterate 一次 。
Space Complexity:
如何选择移动的指针
移动的那个必须是当前的min
。
Area 由宽度和高度决定,高度是当前 2 个指针的 min。
当指针在向中心移动时,宽度一定在缩小,若想让 area 变大,只能希望高度变高。
Case 1: 移动 height 为 min 的指针
移动后,宽度一定变低,如果移动的不是 height 为 min 的指针,高度永远不可能变高。如果移动的是 height 低的那个,则有可能最终达到高的那个的 height。