手记

算法题:木桶中盛最多的水

题目描述:

给定n个非负整数a1 a2…, an,其中每一个代表坐标(i, ai)上的一个点。画n条垂直线,使直线i的两个端点分别为(i, ai)和(i, 0),找出两条直线作为木板,与x轴的平面一起构成一个木桶,使木桶中含有最多的水。

题目举例:

输入:[1,8,6,2,5,4,8,3,7]
输出: 49

解答办法:

木桶原理,就是木桶中盛的水的多少,受较短的木板所限制。
所以我们取两个指针,一个在数组的开头,一个在数组的末尾,组成了行长度。然后,我们维护一个变量来存储到目前为止获得的最大面积。在每一步中,我们找出它们之间形成的区域,更新这个最大面积,并将指针指向较短的线的另一端移动一步。

代码实现:

class Solution {
    public int maxArea(int[] height) {
        int l=0;
        int r= height.length-1;
        
        int result = 0;
        
        while(l<r){
            result = Math.max(result, Math.min(height[l],height[r])*(r-l));
            
            if(height[l]<height[r]){
                l++;
            }else{
                r--;
            }
        }
        
        return result;
            
    }
}
1人推荐
随时随地看视频
慕课网APP