问题描述
给定 n 个非负整数 a1,a2,…,an,每个数代表坐标中的一个点 (i, ai) 。在坐标内画 n 条垂直线,垂直线 i 的两个端点分别为 (i, ai) 和 (i, 0)。找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。
**说明:**你不能倾斜容器,且 n 的值至少为 2。
图中垂直线代表输入数组 [1,8,6,2,5,4,8,3,7]。在此情况下,容器能够容纳水(表示为蓝色部分)的最大值为 49。
示例:
输入: [1,8,6,2,5,4,8,3,7]
输出: 49
思路
这题用左右指针法,所求容量由两边中较小的一边决定;所以左右指针在较小边移动
- 声明
left,right
下标 - 比较
height[left]
和height[right]
的大小,底边长度为right-left
,容量计算为min(height[left],height[right]) * (right-left)
,较小边移动 - 重复第2步,知道
left >= right
PS: Golang的math.Max函数的参数和返回值都是float64类型,又不支持重载。刷题时还是自己写吧
CPP
class Solution {
public:
int maxArea(vector<int>& height) {
int maxArea = 0;
int tmp = 0;
int len = height.size();
if(len == 0)return 0;
int left = 0,right = len - 1;
while(left < right)
{
if(height[left] < height[right])
{
tmp = height[left] * (right-left);
left++;
}
else
{
tmp = height[right] * (right-left);
right--;
}
maxArea = max(maxArea,tmp);
}
return maxArea;
}
};
GO
func maxArea(height []int) int {
sz := len(height)
left, right := 0, sz-1
var maxArea int
var tmp int
for left < right{
if height[left] < height[right]{
tmp = height[left] * (right - left)
left++
}else{
tmp = height[right] * (right - left)
right--
}
maxArea = max(maxArea,tmp)
}
return maxArea
}
func max(a,b int) int{
if a > b{
return a
}
return b
}