11. 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 and n is at least 2.
The above vertical lines are represented by array [1,8,6,2,5,4,8,3,7]. In this case, the max area of water (blue section) the container can contain is 49.
Example:
Input: [1,8,6,2,5,4,8,3,7] Output: 49
粗暴的解法所有的可能都遍历一边,时间复杂度为O(n^2)
代码如下:
int maxArea(int* height, int heightSize){
int i, j;
int iMax = 0;
int iMaxindex = 0;
for(i = 0; i <heightSize-1; i++)
{
for(j = i+1; j< heightSize; j++)
{
if(height[i] >= height[j])
{
iMaxindex = height[j]*(j-i);
}
else
{
iMaxindex = height[i]*(j-i);
}
if(iMaxindex > iMax)
iMax = iMaxindex;
}
}
return iMax;
}
可想而知,渣渣结果,运行时间超过百分之7.9
优化解法:
这个容器最大,左右选择索引,选择最高的值作为固定点,另一边就不断加或者减,这样的做法是可以把复杂度减低至O(n)
int maxArea(int* height, int heightSize){
int i, j;
int iMax = 0;
int iLeft = 0;
int iRight = heightSize - 1;
while(iLeft < iRight)
{
if(height[iLeft] > height[iRight])
{
if(iMax < (height[iRight]*(iRight-iLeft)))
iMax = height[iRight]*(iRight-iLeft);
iRight--;
}
else
{
if(iMax < (height[iLeft]*(iRight-iLeft)))
iMax = height[iLeft]*(iRight-iLeft);
iLeft++;
}
}
return iMax;
}