【打卡第195道】【数组】【leetCode高频】:【hard】42. 接雨水

1、题目描述

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

【打卡第195道】【数组】【leetCode高频】:【hard】42. 接雨水_第1张图片

【打卡第195道】【数组】【leetCode高频】:【hard】42. 接雨水_第2张图片 

2、算法分析

这是一道hard的题目。这个题在2022校招,美团还有网易还是哪家公司,忘记了,考的这个。好像是原版不动,改了个数。

我们只需要关注当前位置的左边的最高墙,当前位置右边的最高墙。

只需要看左边最高的墙和右边最高的墙。

【打卡第195道】【数组】【leetCode高频】:【hard】42. 接雨水_第3张图片

【打卡第195道】【数组】【leetCode高频】:【hard】42. 接雨水_第4张图片

 

【打卡第195道】【数组】【leetCode高频】:【hard】42. 接雨水_第5张图片 

【打卡第195道】【数组】【leetCode高频】:【hard】42. 接雨水_第6张图片 

3、代码实现

class Solution {
    public int trap(int[] height) {
        int res = 0;
        int len = height.length;
        //最两端的列不用考虑,因为一定不会有水。所以下标从 1 到 length - 2
        for(int i = 1;i < len - 1;i++){
            int max_left = 0;
            // 找出左边的最高墙
            for(int j = i - 1;j >= 0;j--){
                if(height[j] > max_left){
                    max_left = height[j];
                }
            }
            // 找出右边的最高墙
            int max_right = 0;
            for(int j = i + 1;j < len;j++){
                if(height[j] > max_right){
                    max_right = height[j];
                }
            }
            // 找出当前的元素的比较小的那个。
            int minVal = Math.min(max_left,max_right);
            // 找到比当前元素大的元素
            if(height[i] < minVal){
                res += minVal - height[i];
            }
        }
        return res;
    }
}

你可能感兴趣的:(【算法】,leetcode,算法,职场和发展)