给定一个长度为 n
的整数数组 height
。有 n
条垂线,第 i
条线的两个端点是 (i, 0)
和 (i, height[i])
。
找出其中的两条线,使得它们与 x
轴共同构成的容器可以容纳最多的水。
返回容器可以储存的最大水量。
1.暴力算法
//暴力算法
func maxArea(height []int) int {
max := 0//用于记录当前找到的最大容器面积。
m := 0//表示两个线段之间的水平距离(宽度)
n := 0//表示两个线段中较短的高度
sum := 0//用于计算当前组合的容器面积
j := 0//内层循环的索引变量,用于枚举每个可能的右边界
lens :=len(height)
for i := 0;i<lens-1;i++{
for j = i+1;j<lens;j++{
m = j-i
if height[i]<height[j]{//是两个线段中较短的高度.因为容器的容量由较短的线段决定。
n = height[i]
}else {
n = height[j]
}
sum = n*m
if sum > max{//如果当前组合的面积大于之前记录的最大面积,则更新 max
max = sum
}
}
}
return max
}
通过双循环遍历每种长宽所组成的长方形,并从中选出最大面积。
2.双指针法
func maxArea(height []int) int {
right := len(height)-1//指向数组的末尾位置
left := 0//指向数组的起始位置
max := 0//用于记录当前找到的最大容器面积
m := 0//表示两个指针之间的水平距离(宽度
n := 0//表示两个指针所指线段的较短高度
sum := 0// 用于计算当前容器的面积
for left < right{
m = right-left
if height[left]<=height[right]{//移动较短的线段有可能找到更高的线段,从而增加容器的面积
n = height[left]
left ++
}else {
n = height[right]
right --
}
sum = n*m
if sum > max{
max = sum
}
}
return max
}
利用双指针法,
-
通过两个指针从数组的两端开始向中间移动,逐步缩小搜索范围。
-
每次移动较短的线段对应的指针,因为移动较短的线段有可能找到更高的线段,从而增加容器的面积。