题目:
Given n non-negative integers a1, a2, ..., an, where each represents a point at coordinate (i, ai). n vertical lines are drawn such that the two endpoints of line i is at (i, ai) and (i, 0). Find two lines, which together with x-axis forms a container, such that the container contains the most water.
Note: You may not slant the container and n is at least 2.
思路:
题意是求两条垂线与x轴围成的最大面积
即求
max((j-i)*min(height[i],height[j]))
解题:
暴力解法,直接双重循环穷举最大值不出意外超时了。
class Solution {
public:
int maxArea(vector<int>& height) {
int n = height.size();
int i, j = 0;
int max=0;
for (i = 0; i < n - 1; i++)
{
for (j = i + 1; j < n; j++)
{
if ((j - i )*min(height[i],height[j])>= max)
{
max = (j - i)*min(height[i],height[j]);
}
}
}
return max;
}
int min(int x, int y)
{
return x <= y ? x : y;
}
};
O(N)解法,定义两个指针,分别指向头和尾,由于容易装水的容量是由小端决定,所以指针移动的准则就是小端指针移动。
只需要遍历一遍就能得到最大值。
class Solution {
public:
int maxArea(vector<int>& height) {
int i, j, max;
int con, min;
j = height.size() - 1;
i = max = 0;
while (j > i)
{
min = height[i] > height[j] ? height[j] : height[i];
con = (j - i)*min;
if (height[j] > height[i])
{
i++;
}
else
j--;
if (con >= max)
max = con;
}
return max;
}
};