暴力法 (超时)
最先想到的思路:逐个区间计算,取最大值
func maxArea(height []int) int {
maxArea := 0
if len(height) == 2{
return min(height[0], height[1])
}
for i:=0; i<len(height); i++{
for j:=i+1; j<len(height);j++{
area := min(height[i], height[j]) * (j-i)
maxArea = max(maxArea, area)
}
}
return maxArea
}
func min(a, b int) int{
if a < b{
return a
}
return b
}
func max(a, b int) int{
if a > b{
return a
}
return b
}
解法一:双指针
用 left 和 right 两个指针从两端向中心收缩,一边收缩一边计算 [left, right] 之间的矩形面积,取最大的面积值即是答案
技巧:循环中每次if语句为什么要移动高度较低的一边,因为矩形的高度是由 min(height[left], height[right]) 即较低的一边决定的,如果移动较低的那一边,那条边可能会变高,使得矩形的高度变大,进而就「有可能」使得矩形的面积变大;相反,如果你去移动较高的那一边,矩形的高度是无论如何都不会变大的,所以不可能使矩形的面积变得更大。
func maxArea(height []int) int {
left, right := 0, len(height)-1
maxArea := 0
for left < right{
maxArea = max((min(height[left], height[right]) * (right-left)), maxArea)
// 移动较低的一边
if height[left] < height[right] {
left++
}else{
right--
}
}
return maxArea
}
func max(a, b int) int{
if a > b {
return a
}
return b
}
func min(a, b int) int{
if a < b {
return a
}
return b
}
- 时间复杂度:O(n)
- 空间复杂度:O(1)