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.
【analyze】
1.穷举的方法时间复杂度为O(n)
2.若从两边逼近并记录最大值,令left=0,right=length-1;若height[left]>height[right],则right--;反之,则left++。
为什么能这么做呢?需要用到反证思想,假设i-j取到最大值,则i之前都要小于height[i]
3.还可改进下,不用每次都减一
【算法】
v1: public class Solution { public int maxArea(int[] height) { int res=0; int l=0; int r=height.length-1; while(l<r) { int w=r-l; int h=Math.min(height[l],height[r]); res=Math.max(res,w*h); if(height[l]<height[r]) l++; else r--; } return res; } } v2: public class Solution { public int maxArea(int[] height) { int res=0; int l=0; int r=height.length-1; while(l<r) { int w=r-l; int h=Math.min(height[l],height[r]); res=Math.max(res,w*h); if(height[l]<height[r]) { int temp=l; while(temp<r&&height[temp]<=height[l]) temp++; l=temp; } else { int temp=r; while(temp>l&&height[temp]<=height[r]) temp--; r=temp; } } return res; } }