力扣——接雨水

题目

给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。

示例

输入:height = [0,1,0,2,1,0,1,3,2,1,2,1]
输出:6
解释:上面是由数组 [0,1,0,2,1,0,1,3,2,1,2,1] 表示的高度图,在这种情况下,可以接 6 个单位的雨水(蓝色部分表示雨水)。

双指针

思路

使用双指针遍历的方法,在遍历的过程中,寻找大小不同的两根柱子(一个指针不动,另一个指针去找),计算这两根柱子接水容量,然后继续寻找下一组,最后全部相加即得到能给接的雨水量。

解题方法

首先找到特殊情况,当数组数量小于3时,必然不可能形成凹槽接到雨水。然后定义两个双指针(一个stay指针指向当前柱子,一个move指针往后寻找符合条件的柱子),在move指针移动的过程中,将不符合条件的柱子高度累加到一个offset变量中,在move指针找到符合条件的柱子后,stay指针指向的柱子高度乘上两个指针的距离再减去offset即可得到一个符合条件的容量数据。同时还要考虑当move指针已经指向最后一个柱子时却没有找到一个高度小于等于stay指针指向的柱子时,需要从数组末尾开始逆向遍历,用相同的方法得到最后一个容量数据

Code

java 复制代码
class Solution {
    public int trap(int[] height) {
 if (height.length < 3){
            return 0;
        }
        int maxCapacity = 0;
        int stay = 0;
        int move = stay + 1;
        int offset = 0;
        while (move < height.length){
            if (move == height.length - 1 && height[stay] >= height[move]){//需要逆向遍历的特殊情况
                int newOffset = 0;
                int newStay = move;
                int newMove = newStay - 1;
                while (newMove >= stay){
                    if (height[newStay] <= height[newMove]){
                        maxCapacity += height[newStay] * (newStay - newMove - 1) - newOffset;
                        newOffset = 0;
                        newStay = newMove--;
                        continue;
                    }
                    newOffset += height[newMove];
                    newMove--;
                }
                break;
            }

            if (height[stay] <= height[move]){
                maxCapacity += height[stay] * (move - stay - 1) - offset;
                offset = 0;
                stay = move++;
                continue;
            }

            offset += height[move];
            move++;
        }

        return maxCapacity;
    }
}
相关推荐
vvilkim14 分钟前
深入理解Java访问修饰符:封装的艺术
java·开发语言
夜斗小神社34 分钟前
【LeetCode 热题 100】(六)矩阵
算法·leetcode·矩阵
張萠飛1 小时前
生产环境Tomcat运行一段时间后,如何测试其性能是否满足后续使用
java·tomcat
Hurry61 小时前
web应用服务器tomcat
java·前端·tomcat
天地一流殇2 小时前
SimBA算法实现过程
深度学习·算法·对抗攻击·黑盒
hqxstudying2 小时前
java分布式定时任务
java·开发语言·分布式
present--012 小时前
【JAVA EE初阶】多线程(进阶)
java·java-ee
小猪咪piggy2 小时前
【JavaEE】(10) JavaEE 简介
java·spring·java-ee
yangmf20402 小时前
Easysearch 冷热架构实战
java·大数据·elasticsearch·搜索引擎
2501_924730612 小时前
智慧城管复杂人流场景下识别准确率↑32%:陌讯多模态感知引擎实战解析
大数据·人工智能·算法·计算机视觉·目标跟踪·视觉检测·边缘计算