力扣-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 @   晚生小白  阅读(34)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 提示词工程——AI应用必不可少的技术
· 地球OL攻略 —— 某应届生求职总结
· 字符编码:从基础到乱码解决
· SpringCloud带你走进微服务的世界
点击右上角即可分享
微信分享提示