Container With Most Water
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.
O(N^2)
class Solution {
public:
int maxArea(vector<int> &height) {
int maxArea = 0;
int temp = 0;
for(int i = 0; i < height.size(); ++i)
{
if(0 == height[i])
continue;
int nextIdx = max(maxArea/height[i] + i, i + 1);//without this line, will break time limit
for(int j = nextIdx; j < height.size(); ++j)
{
temp = (j - i)*min(height[i], height[j]);
if(temp > maxArea)
maxArea = temp;
}
}
return maxArea;
}
};
O(N)。非常好的想法,需要仔细体会一下!
class Solution {
public:
int maxArea(vector<int> &height) {
int left = 0;
int right = height.size() - 1;
int ret = 0;
int temp = 0;
while(left < right)
{
temp = min(height[left],height[right])*(right - left);
ret = max(temp, ret);
if(height[left] <= height[right])
{
int leftnum = height[left];
while(++left < right && height[left] <= leftnum);
}
else
{
int rightnum = height[right];
while(--right > left && height[right] <= rightnum);
}
}
return ret;
}
};