力扣-11蓄水最多问题-双指针

方法一:直接for循环

时间复杂度为O(n2)

优点:简单

缺点:效率太低

public static int maxArea1(int[]height){
    int max=0;
    int area=0;
    for (int i=0;i<height.length-1;i++){
        for (int j=i+1;j< height.length;j++){
            area=(j-i)*Math.min(height[i],height[j]);
            max=area>max?area:max;
        }
    }
    return max;
}

虽然该代码中已经将for循环优化了,次数未n2\2,但是复杂度仍然是O(n2)

 

方法二:双指针

时间复杂度:O(n)

相比方法一,这种方法复杂度直接下降一个数量级

public static int maxArea2(int[]height){
    // 设置双指针
    int i=0;
    int j=height.length-1;
    // 当前蓄水量
    int res=0;
    // 最大蓄水量
    int maxRes=0;
    while (i<j){
        res=height[i]<height[j]?(j-i)*Math.min(height[i++],height[j]):(j-i)*Math.min(height[j--],height[i]);
        maxRes=res>maxRes?res:maxRes;
    }
    return maxRes;
}

思想:res=(j-i)*min(height[i],height[j])

蓄水量是由短的那根板决定的,

移动木板会使宽度下降,

所以,如果移动长的木板,高度不变,宽度减小,蓄水量变小;只有移动短的木板,使木板变长才有可能使蓄水量增大

posted @ 2022-09-13 10:25  晚生小白  阅读(39)  评论(0)    收藏  举报