第四题:盛最多的水

题目描述:

给你 n 个非负整数 a1,a2,...,an,每个数代表座标中的一个点 (i, ai) 。在座标内画 n 条垂直线,垂直线 i 的两个端点分别为 (i, ai) 和 (i, 0)。找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。

说明:你不能倾斜容器,且 n 的值至少为 2。

思路分析:这题最容易想到的就是暴力解法,两个for循环搞定,时间复杂度为O(n2)

 但其实可以利用双指针法,使时间复杂度为O(n),注意到这两个特点:1、相同情况下,两边距离越远越好 
2、区域大小受限于最短边

于是  当左边较短时,应移动左边   ; 右边较短时,应移动右边; 两边相等,则两边皆可移动。

 

代码实现:

public class Solution4 {
    int max = 0;
    //暴力解法
    public static int maxArea(int[] height) {
        for(int i = 0; i < height.length ; i++){
            for(int j = i+1 ; j < height.length ; j++){
                int temp = Math.min(height[i],height[j]) * (j - i);
                max = Math.max(temp,max);
            }
        }   
        return max;
    }
}
public class Solution4 {

    //双指针解法
    public static int maxArea(int[] height) {
        int l = 0;
        int r = height.length - 1;
        int max = Math.min(height[l], height[r]) * (r - l);
        while (l < r) {

            int temp = Math.min(height[l], height[r]) * (r - l);
            max = Math.max(max, temp);

            if (height[l] < height[r]) {
                l++;
            } else if (height[l] > height[r]) {
                r--;
            } else {
                l++;
                r--;
            }
        }

        return max;
    }

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章