网易首页 > 网易号 > 正文 申请入驻

面试了一个字节的候选人,我怕他觉得简单,是在侮辱字节,让他写3D接雨水,结果他没写出来。

0
分享至

(关注数据结构和算法,了解更多新知识)

我们都知道字节喜欢考算法题,并且有些时候考的比较难,这让很多想进入字节的程序员感到头疼。所以当字节的程序员到其他大厂面试的时候,大家也喜欢出一些高难度的算法题。

这不最近一字节员工在面试的时候,一网友怕他嫌题简单侮辱字节,所以就索性让他写3D接雨水,结果他没写出来。

我们知道LeetCode有两道接雨水的题,一道是二维的,一道是三维的,并且难度都是hard,其中二维的接雨水我们前面刚讲过:。

对于该字节员工没有写出3D接雨水问题,很多网友都是一片嘲讽,我们来看下大家是怎么评论的。

--------------下面是今天的算法题--------------

来看下今天的算法题,这题是LeetCode的第407题:接雨水 II。这题也是很多大厂的面试题,比如字节,京东,携程,尤其是京东特别爱考这题。

问题描述

来源:LeetCode第407题

难度:困难

很给你一个 m x n 的矩阵,其中的值均为非负整数,代表二维高度图每个单元的高度,请计算图中形状最多能接多少体积的雨水。

示例1:


输入: heightMap = [[1,4,3,1,3,2],[3,2,1,3,2,4],[2,3,3,2,3,1]] 输出: 4 解释: 下雨后,雨水将会被上图蓝色的方块中。总的接雨水量为1+2+1=4。

示例2:


输入: heightMap = [[3,3,3,3,3],[3,2,2,2,3],[3,2,1,2,3],[3,2,2,2,3],[3,3,3,3,3]] 输出: 10

  • m == heightMap.length

  • n == heightMap[i].length

  • 1 <= m, n <= 200

  • 0 <= heightMap[i][j] <= 2 * 10^4

问题分析

对于3D接雨水问题,首先边上的位置是不能盛水的,只有里面的才有可能盛水。我们把边上围成的一圈看成一个桶,如下图所示:

根据木桶原理,桶中水的高度取决于最小的那块木板,所以我们可以计算和最短木板挨着的位置(上下左右四个方向)所能容纳的水量,如果该位置比最短木板还高,明显是不能盛水的,该位置只有低于木板的高度,才会盛水。

每个位置计算之后,为了方便每次查找最小值,我们可以把计算之后的位置添加到最小堆中,下一次就从堆中继续取出最小值,在计算他的上下左右四个方向。。。

如下图所示,我们看到桶的一周最矮的是 4 ,计算和它挨着的高度为 3 的位置,他可以盛一个单位的水,盛水之后他的高度就变成 4 了。然后和里面的 4 挨着的有 8 和 9 ,他们都比 4 大,所以他们是不能盛水的。

接着我们再取出最小值 8 ,和它挨着的 6 是可以盛水的,一直重复上面的步骤,直到所有点都计算完为止。

我们还可以这样来想一下,因为使用的是BFS的遍历方式,每次都是从堆中取最小值遍历他的上下左右四个方向,而堆中的元素都是遍历过的,所以所有计算过的位置都是连通的,从最外面一圈开始,逐渐往内计算,类似于农村包围城市,最终全部包围。

JAVA:

public int trapRainWater(int[][] heightMap) {
    PriorityQueue

  pq = new PriorityQueue<>(Comparator.comparingInt((int[] a) -> a[2]));     int m = heightMap.length;// 矩阵的高     int n = heightMap[0].length;// 矩阵的宽     boolean[][] visited = new boolean[m][n];     // 先把四周所有元素添加到堆中。     for (int i = 0; i < m; ++i)         for (int j = 0; j < n; ++j)             if (i == 0 || i == m - 1 || j == 0 || j == n - 1) {                 pq.offer(new int[]{i, j, heightMap[i][j]});                 visited[i][j] = true;             }     int water = 0;// 接的雨水量     // 上下左右     int[][] dirs = {{0, -1}, {0, 1}, {-1, 0}, {1, 0}};     while (!pq.isEmpty()) {         int[] nums = pq.poll();         for (int[] dir : dirs) {// 遍历当前出队元素的上下左右四个方向。             int x = nums[0] + dir[1];             int y = nums[1] + dir[0];             // 不能越界             if (y < 0 || y >= n || x < 0 || x >= m || visited[x][y])                 continue;             visited[x][y] = true;// 标记为已计算过             water += Math.max(0, nums[2] - heightMap[x][y]);// 计算水量             pq.add(new int[]{x, y, Math.max(nums[2], heightMap[x][y])});         }     }     return water; }

C++:

public:
    int trapRainWater(vector

 > &heightMap) {         struct TupleCompare {             bool operator()(const tuple

  &a, const tuple

  &b) const {                 return get<2>(a) > get<2>(b);             }         };         priority_queue int,  int,  int>,  vector int,  int,  int>>, TupleCompare> pq; //  最小堆          int m = heightMap.size(); // 矩阵的高          int n = heightMap[ 0].size(); // 矩阵的宽          vector

 > visited(m, vector

 (n, false));          // 先把四周所有元素添加到堆中。          for ( int i =  0; i < m; ++i)              for ( int j =  0; j < n; ++j)                  if (i ==  0 || i == m -  1 || j ==  0 || j == n -  1) {                     pq.emplace(i, j, heightMap[i][j]);                     visited[i][j] =  true;                 }          int water =  0; // 接的雨水量          // 上下左右          int dirs[][ 2] = {{0,  -1},                          {0,  1},                          {-1, 0},                          {1,  0}};          while (!pq.empty()) {             tuple nums = pq.top();             pq.pop();              for ( const  auto &dir: dirs) { // 遍历当前出队元素的上下左右四个方向。                  int x = get< 1>(nums) + dir[ 0];                  int y = get< 0>(nums) + dir[ 1];                  // 不能越界                  if (x <  0 || x >= n || y <  0 || y >= m || visited[y][x])                      continue;                 visited[y][x] =  true; // 标记为已计算过                 water += max( 0, get< 2>(nums) - heightMap[y][x]); // 计算水量                 pq.emplace(y, x, max(get< 2>(nums), heightMap[y][x]));             }         }          return water;     }





Python:

def trapRainWater(self, heightMap: List[List[int]]) -> int:
    pq = []
    m = len(heightMap)  # 矩阵的高
    n = len(heightMap[0])  # 矩阵的宽
    visited = [[False for _ in range(n)] for _ in range(m)]

    # 先把四周所有元素添加到堆中。
    for i in range(m):
        for j in range(n):
            if i == 0 or i == m - 1 or j == 0 or j == n - 1:
                heapq.heappush(pq, (heightMap[i][j], i, j))
                visited[i][j] = True

    water = 0  # 接的雨水量
    # 上下左右
    dirs = [[0, -1], [0, 1], [-1, 0], [1, 0]]
    while pq:
        n0, n1, n2 = heapq.heappop(pq)
        for dx, dy in dirs:  # 遍历当前出队元素的上下左右四个方向。
            x = n1 + dx
            y = n2 + dy
            # 不能越界
            if x < 0 or x >= m or y < 0 or y >= n or visited[x][y]:
                continue
            visited[x][y] = True  # 标记为已计算过
            water += max(0, n0 - heightMap[x][y])  # 计算水量
            heapq.heappush(pq, (max(n0, heightMap[x][y]), x, y))
    return water

笔者简介

博哥,真名:王一博,毕业十多年, 作者,专注于 数据结构和算法 的讲解,在全球30多个算法网站中累计做题2000多道,在公众号中写算法题解800多题,对算法题有自己独特的解题思路和解题技巧,喜欢的可以给个关注,也可以 下载我整理的1000多页的PDF算法文档 。


特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相关推荐
热点推荐
重要!河南省疾控中心2026年6月份健康风险提示

重要!河南省疾控中心2026年6月份健康风险提示

大象新闻
2026-06-02 12:35:48
美国展出文徵明89岁的行书,不愧是大才子,每个字都登峰造极!

美国展出文徵明89岁的行书,不愧是大才子,每个字都登峰造极!

书法网
2026-05-30 17:23:03
哈尔滨啤酒在香港被检出呕吐毒素,厂商回应:仅在内地销售

哈尔滨啤酒在香港被检出呕吐毒素,厂商回应:仅在内地销售

潇湘晨报
2024-04-22 14:14:16
闹大了!中方驱逐美国记者后,不到24小时,美吊销新华社记者许可

闹大了!中方驱逐美国记者后,不到24小时,美吊销新华社记者许可

娱乐的宅急便
2026-06-02 14:59:09
罗马尼亚驱逐领事并关闭俄罗斯领事馆

罗马尼亚驱逐领事并关闭俄罗斯领事馆

一种观点
2026-05-29 21:03:39
日媒:小泉正面硬刚,称中国没资格对日本防务说三道四

日媒:小泉正面硬刚,称中国没资格对日本防务说三道四

林子说事
2026-06-01 19:00:08
3-2大冷门,世界第104淘汰世界第22,进法网男单8强,创个人最佳战绩

3-2大冷门,世界第104淘汰世界第22,进法网男单8强,创个人最佳战绩

俯身冲顶
2026-06-02 07:44:17
官宣!周星驰入股内地一企业

官宣!周星驰入股内地一企业

深圳晚报
2026-06-02 12:25:02
长寿的人,手背多有这4个表现,占一个都不错,快看看你有几个?

长寿的人,手背多有这4个表现,占一个都不错,快看看你有几个?

芹姐说生活
2026-05-31 22:41:04
太残酷了!阿布达比刚重仓介入,直接15个跌停,中东大佬亏惨了

太残酷了!阿布达比刚重仓介入,直接15个跌停,中东大佬亏惨了

鹏哥投研
2026-06-02 14:25:16
乌克兰首都基辅传出连续剧烈爆炸声

乌克兰首都基辅传出连续剧烈爆炸声

环球网资讯
2026-06-02 07:36:10
武汉商学院原党委书记刘志辉被查

武汉商学院原党委书记刘志辉被查

新京报
2026-06-01 21:24:41
人有两不去,去了家不旺:聪明的老人从来不去这两个地方

人有两不去,去了家不旺:聪明的老人从来不去这两个地方

心理观察局
2026-05-24 07:41:11
首次公开电子干扰:荷兰军舰通信中断超12分钟,反制升到哪一级?

首次公开电子干扰:荷兰军舰通信中断超12分钟,反制升到哪一级?

荷兰豆爱健康
2026-05-31 12:02:55
明朝灭亡真相:百万皇族每年吃掉80%国库,比清朝更狠的败家子

明朝灭亡真相:百万皇族每年吃掉80%国库,比清朝更狠的败家子

历史甄有趣
2026-06-02 15:50:08
003004,拟2.51亿并购光模块企业!此前19个交易日股价翻番

003004,拟2.51亿并购光模块企业!此前19个交易日股价翻番

证券时报e公司
2026-06-02 10:00:09
王楚钦给闫安留言,小勒布伦和女友游玩,邱党期待樊振东加入

王楚钦给闫安留言,小勒布伦和女友游玩,邱党期待樊振东加入

春日筆記
2026-06-02 15:05:42
最新!江西任免一批领导干部

最新!江西任免一批领导干部

黄河新闻网吕梁
2026-06-02 10:33:08
日媒称“日本人不去中国,中国旅游业遭重创”!日网友嗨翻:他们失去日本游客很难受!

日媒称“日本人不去中国,中国旅游业遭重创”!日网友嗨翻:他们失去日本游客很难受!

东京新青年
2026-05-31 18:08:07
《家业》李祯狠过狐狸!田本昌以为囚住了她,没成想他才是笼中鳖

《家业》李祯狠过狐狸!田本昌以为囚住了她,没成想他才是笼中鳖

荒野老五
2026-06-02 14:52:57
2026-06-02 16:35:00
数据结构和算法
数据结构和算法
专门介绍和写算法题解的号
273文章数 4关注度
往期回顾 全部

头条要闻

郑丽文正在访美称愿意与特朗普会面 外交部表态

头条要闻

郑丽文正在访美称愿意与特朗普会面 外交部表态

体育要闻

1米74的业余联赛替补,在英超踢中卫

娱乐要闻

奚梦瑶何猷君婚礼曝光 深情热吻甜蜜

财经要闻

锂电“资源墙”高筑 全球性长期博弈开始

科技要闻

烧掉千亿后,美团、阿里、京东谁先止血?

汽车要闻

星途神秘新车轮廓曝光 又一款性能SUV要来了?

态度原创

数码
艺术
旅游
时尚
公开课

数码要闻

华为nova 16系列发布:2999元起 全系配备后置红枫原色镜头

艺术要闻

周杰伦花 1.36 亿拍下这幅画

旅游要闻

去新加坡自由行怎么选?高德扫街榜用真实到店数据给出答案

推广|| 入夏第一双鞋买得好成功!暴走1w步、搭遍小裙子

公开课

李玫瑾:为什么性格比能力更重要?

无障碍浏览 进入关怀版