题目: 给你 n 个非负整数 a1,a2,...,an,每个数代表坐标中的一个点 (i, ai) 。在坐标内画 n 条垂直线,垂直线 i 的两个端点分别为 (i, ai) 和 (i, 0) 。找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。
来源:力扣(LeetCode) 链接:leetcode-cn.com/problems/co… 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
解法:
方法一:暴力法+剪枝
func maxArea(height []int) int {
max := 0
length := len(height)
for i := 1; i < length ; i ++ {
if max < height[i] * i { // 剪枝
for j := 0; j < i; j ++ {
area := (i - j) * min(height[i], height[j])
if area > max {
max = area
}
}
}
}
return max
}
func min(a, b int) int {
if a < b {
return a
}
return b
}
方法二: 双指针
以下代码找到这样一个关系:min(x,y')∗t' < min(x,y)∗t
用语言描述就是,如果将移动较高的轴,得到的面积始终小于当前面积,为了找到更大的面积,只能移动矮轴
其中x,y代表左右两个轴的高度,t横轴坐标宽度;y',t'表示将高度较高的轴移动之后的轴高度和横轴宽度。
func maxArea(height []int) int {
max := 0
length := len(height)
l, r := 0, length - 1
for l < r {
area := min(height[l], height[r]) * (r - l)
if area > max {
max = area
}
if height[l] < height[r] {
l ++
} else {
r --
}
}
return max
}
func min(a, b int) int {
if a < b {
return a
}
return b
}