题目
LeetCode: Container With Most Water
给定 n 个非负整数 a1,a2,…,an,每个数代表坐标中的一个点 (i, ai) 。画 n 条垂直线,使得垂直线 i 的两个端点分别为 (i, ai) 和 (i, 0)。找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。
注意:你不能倾斜容器,n 至少是2。
思路
左右指针法
首先指针指向最左、最右
当左边的高度大时,移动左边的边的面积只能是小于当前面积
因为底 = 原来的底 - 1,高最大只能是右边的边的高
所以只能移动右边的高
同理,右边的高大的话,只能移动左边指针才可能获得更大的面积
代码
int maxArea(int* height, int heightSize) {
int max = 0;
int left = 0;
int right = heightSize - 1;
int cur = 0;
//左右指针法,时间复杂度O(N)
while (left < right)
{
//cur为当前面积
cur = (right - left) * (height[left] < height[right] ? height[left] : height[right]);
if (max < cur)
{
max = cur;
}
if (height[left] > height[right])
{
//当左边的高度大时,移动左边的边的面积只能是小于当前面积
//因为底 = 原来的底 - 1,高最大只能是右边的边的高
//所以只能移动右边的高
right--;
}
else
{
//分析同上
left++;
}
}
return max;
}