解决LEET代码上的“诱捕雨水”问题
#编程 #编码 #java #discuss

问题

42.诱捕雨水

类型:
喜欢: 29k
不喜欢: 412

问这个问题的公司
公司:没有时间问

亚马逊14
彭博5
Adobe 4
苹果4
高盛3
Yandex 3
EPAM系统2
微软16
Google 9
Uber 4
makemytrip 3
Facebook 2
eBay 2
Salesforce 2
英特尔8
Rubrik 8
Qualtrics 7
特斯拉6
Oracle 5
城堡5
VMware 4
C3物联网4
Snapchat 3
提起3
签证3
贝宝3
ServiceNow 3
Swiggy 3
国家乐器3
智慧3
Zoho 2
Intuit 2
Coupang 2
雅虎2
Expedia 2
Twitch 2
摩根士丹利2
肖2
Teltok 2
navi 2
Airbnb 1
zenefits 1
Twitter 1
Wix 1

给定n个非阴性整数,代表一个高程图,其中每个条的宽度为1,计算下雨后可以捕获多少水。

Rainwater Image

示例1:
输入:高度= [0,1,0,2,1,0,1,3,2,1,2,1]
输出:6

说明:上面的高程图(黑色部分)由阵列[0,1,0,2,1,0,1,3,2,2,1,2,1]表示。在这种情况下,将被困6个雨水(蓝色部分)。

示例2:
输入:高度= [4,2,0,3,2,5]
输出:9

约束:
n == height.length
1 <= n <= 2 * 104
0 <= height[i] <= 105

直觉:

目的是计算给定高度的杆之间的总被困水。我们通过计算每个条的左右边界来实现这一目标,然后根据这些边界计算被困的水。

方法:

  • 初始化为0,LB(左边界)和RB(右边界)数组。
  • 计算输入阵列中每个栏的左边界(LB)和右边界(RB)。
  • 通过输入阵列进行迭代,计算每个条的被困水,然后在Res中堆积。
  • 返回res作为被困的水。

复杂:

时间复杂性: o(n),其中n是输入阵列中的元素数量。

空间复杂性: o(n),由于LB和RB阵列用于存储边界。

代码:

class Solution {
    public int trap(int[] height) {
        int  res = 0;
        int[] lb = new int[height.length];
        int[] rb = new int[height.length];

        lb[0] = height[0];
        for(int i = 1 ; i < height.length -1 ;i++){
            lb[i] = Math.max(height[i],lb[i-1]);
        }

        rb[height.length - 1] = height[height.length - 1 ];
        for(int i = height.length - 2 ; i >= 0;i--){
            rb[i] = Math.max(height[i],rb[i+1]);
        }

        for(int i = 1 ; i < height.length -1 ; i++){
            int tw = Math.min(lb[i],rb[i]) - height[i];
            res = res + tw;
        }

        return res;
    }
}

愉快的编码,
湿婆