0.废话
自己太菜了,每道题感觉都没有什么很好的想法,就只会暴力破解,然而…,这一次他失败了,毕竟是一道medium的题。。。
1.题目描述
传送门
给你 n 个非负整数 a1,a2,…,an,每个数代表坐标中的一个点 (i, ai) 。在坐标内画 n 条垂直线,垂直线 i 的两个端点分别为 (i, ai) 和 (i, 0)。找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。
说明:你不能倾斜容器,且 n 的值至少为 2。
2.题目思路
我就没想动脑子,想先过了再说,就算了所有的面积,时间复杂度为O(N^2),最后超时了,那个大数组给我整蒙了直接。。。
然后,双指针做法就是
由两侧(宽度最大,但高度不一定)向中间(能够遍历高度最大的),保持较大的不变,较小的向中间缩,max保存中间最大的
时间复杂度为O(N)
3.代码
class Solution{
public:
int maxArea(vector<int>& height) {
int n = height.size();
int i = 0;
int j = n - 1;
int max = 0; int s;
while (j - i >= 1)
{
s = (j - i) * (height[i] < height[j] ? height[i] : height[j]);
if (s > max)
max = s;
if (height[j] > height[i])
i++;
else
j--;
}
return max;
}
};