LeetCode--11. Container With Most Water
题目大意,给定一个非负整形数组height[], 下标表示木板的位置,里面元素表示木板的长度。 要求从里面任意选出两块木板,使得围成的容器能够盛放的水的体积最大。
注意:容器的高是两块木板中较短的那个决定。
方法:假定容器两块木板为两侧的两块,左侧为i,右侧为j。
在中间选取一块k,如果height[K]<=min(height[i],height[j]),那么height[k]不可能是构成容器的木板(距离一定小于j-i,且高度不够)
因此我们从i与j较矮的那块木板开始向中间遍历。 如果height[k]比二者中矮的那块木板高,那么可能构成容器,计算体积,如果体积大于原来的体积,那么就更新体积。
public class Solution { public static void main(String args[]){ //int[] height = {4,6,2,6,7,11,2}; int[] height = {4,6,8,10,10,6,8,4}; System.out.println(maxArea(height)); }
public static int maxArea(int[] height) { int len = height.length; if(len==0||len==1) return 0; int v = 0; //记录最大容积 int i = 0 ; //记录起点 int j = len-1; //记录终点 while(i<j){ //从最左和最右开始计算 v = Math.max(v, Math.min(height[i],height[j])*(j-i)); //重新计算最大容积 if(height[i]<height[j]){ //左边是短板,则先从左边开始 int k = i; while(k<j&&height[k]<=height[i]) k++; i=k; }else{ //右边是短板,则从右边开始 int k = j; while(k>i&&height[k]<=height[j]) k--; j=k; } } return v; } }

浙公网安备 33010602011771号