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

面试了一个字节的候选人,我怕他觉得简单,是在侮辱字节,让他写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.

相关推荐
热点推荐
养护成本暴增40%!超重电车让全民买单 该不该限重引热议

养护成本暴增40%!超重电车让全民买单 该不该限重引热议

快科技
2026-05-26 10:34:15
有没有人敢爆自己的瓜?网友:确定玩这么大吗?

有没有人敢爆自己的瓜?网友:确定玩这么大吗?

夜深爱杂谈
2026-02-18 20:55:58
因为太信任豆包,网友们被坑惨了!

因为太信任豆包,网友们被坑惨了!

花朵财经
2026-05-27 14:33:19
一个机器人找人类的游戏,偏偏没中文

一个机器人找人类的游戏,偏偏没中文

晚星归航2
2026-05-27 09:50:44
当年喊出“不是你撞的,干嘛去扶”的法官,17年后,过的咋样了?

当年喊出“不是你撞的,干嘛去扶”的法官,17年后,过的咋样了?

天天热点见闻
2026-05-11 04:47:11
CBA休赛期动态:辽篮主帅敲定乌戈留任 崔永熙或离宏远赴海外练级

CBA休赛期动态:辽篮主帅敲定乌戈留任 崔永熙或离宏远赴海外练级

全球财经网
2026-05-28 12:31:30
邱毅突然出手列四宗罪,不是帮萧旭岑,是救马英九,1月事谁保他

邱毅突然出手列四宗罪,不是帮萧旭岑,是救马英九,1月事谁保他

阿离家居
2026-05-28 13:57:23
操场埋尸案主犯杜少平,被捕5个月内“零口供”,被判死刑后痛哭

操场埋尸案主犯杜少平,被捕5个月内“零口供”,被判死刑后痛哭

莫地方
2026-05-24 01:25:03
四五十岁女人的婚外情人,都是这些“不主动”的男人,男人别想错了

四五十岁女人的婚外情人,都是这些“不主动”的男人,男人别想错了

三农老历
2026-05-28 12:48:24
超费德勒创历史第一!德约3-1连21年进法网32强 120场里程碑

超费德勒创历史第一!德约3-1连21年进法网32强 120场里程碑

醉卧浮生
2026-05-28 07:15:17
上海三甲医院专家凌晨发文:1小时来了6个心梗,这一波很密集!42岁男子打球时突然胸痛,还好队友反应快

上海三甲医院专家凌晨发文:1小时来了6个心梗,这一波很密集!42岁男子打球时突然胸痛,还好队友反应快

新民晚报
2026-04-06 15:15:31
中央5台直播乒乓时间表:5月28日CCTV5+转播国乒!乒超传来新消息

中央5台直播乒乓时间表:5月28日CCTV5+转播国乒!乒超传来新消息

古史青云啊
2026-05-28 11:38:08
普通人最大的消费陷阱之一:换车

普通人最大的消费陷阱之一:换车

新浪财经
2026-05-28 12:55:02
24小时内,杜兰特创造NBA八十年史无前例纪录,获签九千万肥约

24小时内,杜兰特创造NBA八十年史无前例纪录,获签九千万肥约

法老不说教
2026-05-27 13:03:30
东风着陆场就绪,神二十一3人乘组交接将回家:昼夜搜救难度大?

东风着陆场就绪,神二十一3人乘组交接将回家:昼夜搜救难度大?

环球科学猫
2026-05-28 12:40:30
A股:今天周四,股市跳水了,但是,这次情况不同了!

A股:今天周四,股市跳水了,但是,这次情况不同了!

明心
2026-05-28 11:26:40
章若楠空杯到底有多美?网友说:这颜值谁顶得住,难怪都想娶!

章若楠空杯到底有多美?网友说:这颜值谁顶得住,难怪都想娶!

暖心萌阿菇凉
2026-04-30 13:13:01
唐斯经历的一切,此刻的他与尼克斯

唐斯经历的一切,此刻的他与尼克斯

张佳玮写字的地方
2026-05-28 15:00:36
内地投资者有福了!不用开美股账户,也能“上车”SpaceX

内地投资者有福了!不用开美股账户,也能“上车”SpaceX

财通社
2026-05-28 11:54:12
“夏补钾,不疲倦”,入夏后,多吃3种高钾食物,腿脚有劲精神足

“夏补钾,不疲倦”,入夏后,多吃3种高钾食物,腿脚有劲精神足

秀厨娘
2026-05-27 19:56:01
2026-05-28 15:56:49
数据结构和算法
数据结构和算法
专门介绍和写算法题解的号
273文章数 4关注度
往期回顾 全部

头条要闻

20万飞天茅台搭售40万黔茅酒 老板参加"峰会"后称被耍

头条要闻

20万飞天茅台搭售40万黔茅酒 老板参加"峰会"后称被耍

体育要闻

如果雷霆拼图是这水平 马刺确实打不过

娱乐要闻

林俊杰七七与大哥嫂子的瓜剪不断理还乱

财经要闻

长鑫科技IPO过会,市值会到几万亿?

科技要闻

台积电3纳米下半年涨价15% 明年或再涨10%

汽车要闻

限时补贴价9.28-10.98万 MG 4X正式上市

态度原创

家居
本地
游戏
旅游
军事航空

家居要闻

蜂鸟餐椅 线面交错

本地新闻

用剪纸的方式,打开江苏扬州

《红色沙漠》后台出现DLC字样!或将官宣 太神速了

旅游要闻

秀我中国|重庆奉节金凤山云海风车风景如画

军事要闻

美锁定伊朗打击新目标 考虑重启军事行动

无障碍浏览 进入关怀版