LeetCode42.接雨水

LeetCode42.接雨水

题目描述

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

思路分析

  1. 使用 双指针 + 双变量 的方法
  2. 双指针分别指向数组左右两侧的索引,双变量分别保存数组左右两侧的最大值
  3. 依次比较两侧最大值,将较小测指针移动,保证每次移动的都是小的一侧
  4. 然后记录当前指针位置所能存储的水量并记录
  5. 详解见下

源码及分析

public int trap(int[] height) {
        //数据校验
        if (height == null || height.length < 2) {
            return 0;
        }
        //定义 left 和 right 指向数组最左边和最右边索引,然后依次移动左右指针,
        //定义leftMax 和 rightMax 指向左右水柱的最高值
        int totalWater = 0, left = 0, right = height.length - 1, leftMax = 0, rightMax = 0;
        //当两指针重合的时候结束循环
        while (left < right){
            //leftMax指向左侧的最高水柱
            leftMax = Math.max(leftMax,height[left]);
            //rightMax指向右侧的最高水柱
            rightMax = Math.max(rightMax,height[right]);
            //如果当前左侧水柱低于右侧水柱,则当前位置所能存储的水为leftMax - height[left]
            //记录后移动指针
            if (leftMax <= rightMax){
                totalWater += (leftMax - height[left]);
                left ++;
            }else {
                totalWater += (rightMax - height[right]);
                right--;
            }
        }
        return totalWater;
    }

posted @ 2021-05-26 10:43  mx_info  阅读(39)  评论(0)    收藏  举报