题目描述
给定一个长度为 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
输入:[1,1]
输出:1
解题思路
显然,需要使用到双指针的思路来解决该题。指针收缩的条件为:高度较低的一方进行收缩
我们可以定义左指针left,从数组的最左端开始,右指针right,从数组的最右端开始,再定义一个最大的容量maxCap。开启一个循环,循环的条件为 left < right,判断当前left和right所能容纳的容量是否大于maxCap,如果是的话,则进行赋值替换,然后高度较低的一方进行收缩,进入下一轮循环,直到退出循环
代码
func maxArea(height []int) int {
// 声明相关变量指针及最大容量
length := len(height)
left := 0
right := length-1
maxCap := 0
for left < right {
// 如果左指针指向的高度小于右指针,则当前的容量高度则是以左指针为准,反之则是右指针
if height[left] < height[right] {
// 进行最大容量赋值替换
if (right-left)*height[left] > maxCap {
maxCap = max(maxCap, (right-left)*height[left])
}
// 左指针指向的高度更小,左指针收缩
left++
} else {
// 逻辑同上
if (right-left)*height[right] > maxCap {
maxCap = (right-left)*height[right]
}
right--
}
}
return maxCap
}
复杂度分析
时间复杂度:从代码可知,循环逻辑最坏情况下,会执行N次,故其时间复杂度为 O(N),N为数组的长度;
空间复杂度:仅声明了几个简单的int类型变量,因此其空间复杂度为O(1)