day04(11.2)——leetcode面试经典150

42. 接雨水

这题我一开始想的是从左到右遍历除了头尾的所有列,在第i列的时候,先从左边找到最高的一列,再从右边找到最高的一列,再来判断是左边的最高列更小还是右边的最高列更小,最后如果更小的最高列如果大于当前i的高度,则sum要加上他们之间的差值。。。但是这样就寄了,超时了,所以我看题解了哈哈哈哈,用了双指针的方法:

左边一个left指向最左边,右边一个right指向最右边,左边永远小于右边进行循环判断,判断一下当前左右两边的指针是否大于左右两边各自的高度最大值,如果大于,那就更新,如果小于,那就不用管了,然后再进行判断比较左边的最大值大,还是右边的最大值大,如果左边的最大值大,说明左边的墙更高,右边的墙更矮,右边的点只需要低于右边的最大值就能产生积水,所以先判断一下当前右边的点是否小于当前右边的最大值,如果小于,则他们的差值累加到积水的总值上,右边再往中间走一步,左边亦是如此.....

42. 接雨水

题目:

题解:

java 复制代码
class Solution {
    public int trap(int[] height) {
        // 左右指针指向索引
        int left = 0;
        int right = height.length-1;
        // 计算左边碰到最高的柱子的长度
        int leftMax = 0;
        //计算右边碰到最高的柱子的长度
        int rightMax = 0;
        // 用来统计积水
        int sum = 0;
        while(left < right) {
            // 更新当前左边的最高柱子的长度
            if(height[left] > leftMax) {
                leftMax = height[left];
            }
            // 更新当前右边的最高柱子的长度
            if(height[right] > rightMax) {
                rightMax = height[right];
            }
            //如果当前左边的最高柱子短于当前右边柱子的长度
            //此时说明左边如果有短于这个左边最长柱子长度的柱子,
            //那么就一定是积水,所以从左边开始统计积水
            if (leftMax < rightMax ) {
                sum+=(leftMax - height[left]);
                left++;
            }
            //右边更短亦是如此
            else {
                sum+=(rightMax - height[right]);
                right--;
            }
        }
        return sum;
    }
}
相关推荐
非优秀程序员8 小时前
第05章 播放器大战,暴风、快播与那一夜|《互联网产品恩仇录》
算法
文丑颜不良啊11 小时前
LeetCode2481~2500题目解析
java·leetcode
武子康14 小时前
驾驶轨迹换个坐标,就能给移动机器人用吗?
人工智能·算法·机器学习
文丑颜不良啊17 小时前
LeetCode2461~2480题目解析
java·leetcode
文丑颜不良啊19 小时前
LeetCode2441~2460题目解析
java·leetcode
文丑颜不良啊20 小时前
LeetCode2521~2540题目解析
java·leetcode
lisw0520 小时前
Dayhoff的PAM替换矩阵理论评介!
线性代数·算法·矩阵
一起学安全技术21 小时前
拆大模型 03|注意力的一句话版本:不用论文讲清 Attention
深度学习·算法·语言模型·transformer
Delightrs1 天前
Rust LeetCode238 算法题解
开发语言·算法·rust