思路1 双循环(超时了)
1. 确定计算公式
res = min(height[i], height[j]) * (j - i)
2.使用双循环计算出所有的值,保留最大值。
func maxArea(height []int) int { res := 0 length := len(height) if length < 2 { return res } for i := 0; i < length; i++ { for j := i + 1; j < length; j++ { temp := min(height[i], height[j]) * (j - i) res = max(temp, res) } } return res } func max(v1, v2 int) int { if v1 > v2 { return v1 } else { return v2 } } func min(v1, v2 int) int { if v1 > v2 { return v2 } else { return v1 } }
思路2 双指针
1. 首先确定计算公式
res = min(height[left],height[right])*(right-left)
2. 由公式可以看出,res的大小由短板来决定。
在移动指针时,如果移动短板,短板可能会变大,res也可能会增大。
如果移动长板,短板不变的情况下,长板可能不变或者变小,从而导致res不变或者变小。
3. 因此,初始化双指针分列位于左右两端,循环每轮将短板向内移动一格,并更新res最大值,直到指针相遇时跳出;即可获得最大面积。
func maxArea(height []int) int { res := 0 length := len(height) if length < 2 { return res } left := 0 right := length - 1 for left < right { if height[left] < height[right] { res = max(res, height[left]*(right-left)) left += 1 } else { res = max(res, height[right]*(right-left)) right -= 1 } } return res } func max(v1, v2 int) int { if v1 > v2 { return v1 } else { return v2 } }