Leetcode 11. 盛最多水的容器

思路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
}
}

浙公网安备 33010602011771号