LeetCode:盛最多水的容器

方法一:

java 复制代码
class Solution {
    public int maxArea(int[] height) {
        //定义左右指针
        int left = 0;
        int right = height.length - 1;
        //初始化最大储水量
        int maxWater = 0;
        //定义条件,只要左指针 < 右指针(两者没相遇)就继续
        while(left < right){
            //计算当前储水量
            int currentWideth = right - left;
            int currentHeight = Math.min(height[left],height[right]);
            int currentWater = currentWideth * currentHeight;

            maxWater = Math.max(currentWater,maxWater);
            //指针移动找最大的currentHeight
            if(height[left] < height[right]){
                left++;
            }else{
                right--;
            }
        } 
        return maxWater;
    }
}

方法二(省时间):

java 复制代码
class Solution {
    public int maxArea(int[] height) {
        int left = 0;
        int right = height.length - 1;
        int maxWater = 0;

        while(left < right){
            int hLeft = height[left];
            int hRight = height[right];

            int minHeight = hLeft < hRight ? hLeft :hRight;
            int currentWater = minHeight * (right - left);
            if(currentWater > maxWater){
                maxWater = currentWater;
            }

            //这里面又一次加上了,left < right,目的是防止连续的前进导致数组越界报错
            if(hLeft < hRight){
                while(left < right && height[left] <= minHeight){
                    left++;
                }
            }else{
                while(left < right && height[right] <= minHeight){
                    right--;
                }
            }
        }
        return maxWater;
    }
}

第二段代码更省时间主要体现在以下几方面:

第一,第二段代码直接在if-else里面的while循环选高的柱子,而第一段代码不仅每次都要读左右高度计算面积还要读左右高度进行比较选高的柱子,第二段代码省下了第一段代码中每次都要读左右高度用于计算面积这一步的读取。

第二,去掉第一段代码中的Math.min()和Math.max(),改成了if-else和三目运算符,这是底层机器指令,没有任何方法调用,cpu执行快。

第三,第一段代码无论碰到柱子是高是矮都进行一次面积计算,而第二段代码在while循环中进行柱子选择,只有遇到比原来高的柱子才进行面积计算,减少了大量无意义的计算。

相关推荐
布莱克6057 小时前
C++ 中 map 的 insert 与 emplace:key 已存在时会覆盖吗?
开发语言·数据结构·c++·算法·map
D e re k ZH10 小时前
C++ 系统学习手记:从语法细节到工程实践
开发语言·数据结构·c++·算法
石小石Orz11 小时前
AI 正在蚕食我们的编码能力
前端·后端·算法
民乐团扒谱机13 小时前
【微实验】NSGA-II(非支配排序遗传算法)——解决多目标优化问题的“自然选择模拟器”
linux·人工智能·算法
青少儿编程课堂13 小时前
蓝桥杯·全国青少年信息素养大赛·电子学会Python/C++考级:中缀表达式求值解析
c++·python·算法·bfs·信息学竞赛
文丑颜不良啊14 小时前
LeetCode2261~2280题目解析
java·leetcode
武子康15 小时前
Qwen-Drive 到底是什么:4B 级 VLM 如何成为驾驶策略底座
人工智能·算法·机器学习
zh_xuan16 小时前
LeeCode 496. 下一个更大元素I
数据结构·算法·栈·单调栈
机 _ 长16 小时前
05 智算运维|8 张卡怎么才算「捆成一张」:NCCL 实测与拓扑
运维·人工智能·算法·智算运维