题目描述
给定一个长度为 n 的整数数组 height 。有 n 条垂线,第 i 条线的两个端点是 (i, 0) 和 (i, height[i]) 。
找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。
返回容器可以储存的最大水量。
说明:你不能倾斜容器。
示例
示例 1:
输入:[1,8,6,2,5,4,8,3,7] 输出:49
解释:图中垂直线代表输入数组 [1,8,6,2,5,4,8,3,7]。在此情况下,容器能够容纳水(表示为蓝色部分)的最大值为 49。
示例 2:
输入:height = [1,1] 输出:1
提示:
n == height.length 2 <= n <= 105 0 <= height[i] <= 104
解题思路
- 看到这题脑子里的第一反应是,如果最左和左右边都是最高的,那么盛水量最大。退一步思考,越是靠近两端的线高,盛水越多。
- 咱们就可以顺着这个思路来实现,即假设两边最高能盛水最多,再依次像内递进,如果里面的线更高,则说明外面的线不是最高的。
- 但是期间我遇到了通过率的问题,于是刷了力扣的题解,发现
双指针是很好的思路,我之所以有通过率的问题是因为没有考虑到:相同高度时两边的距离越远越好 - 还有性能方面的优化:面积的计算受制于较短边,所以我们在利用双指针计算面试时,可以减少不必要的运算,即:向内移动较短边。
AC代码
func maxArea(height []int) int { i := 0 j := len(height) - 1 var ret int for i < j { var area int if height[i] > height[j]{ area = (j-i)* height[j] }else { area = (j-i)* height[i] } if area > ret { ret = area } if height[i] < height[j] { i++ }else { j-- } } return ret }
运行结果

