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

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

相关推荐
热点推荐
李连杰利智上山修行120天,称为了世界和平,21岁小女儿乖巧陪同

李连杰利智上山修行120天,称为了世界和平,21岁小女儿乖巧陪同

开开森森
2024-06-16 07:24:44
楼市的救市方向,正在南辕北辙

楼市的救市方向,正在南辕北辙

听三哥说
2024-06-13 23:50:04
清华本硕,CPA+司考顶配的37岁金融男,被裁后竟然找不到工作,只求能还房贷…..

清华本硕,CPA+司考顶配的37岁金融男,被裁后竟然找不到工作,只求能还房贷…..

毯叔盘钱
2024-06-15 09:10:09
尿毒症是喝出来的?医生告诫:即便是铁打的肾,这3种水也要少喝

尿毒症是喝出来的?医生告诫:即便是铁打的肾,这3种水也要少喝

莫将离
2024-06-01 23:41:40
中国女排3-2土耳其,上演超级逆转,晋级总决赛,张常宁扮演奇兵

中国女排3-2土耳其,上演超级逆转,晋级总决赛,张常宁扮演奇兵

湘楚风云
2024-06-15 22:41:01
19分6板3助!巩晓彬儿子率队大胜:梦幻脚步+统治攻防,球商真高

19分6板3助!巩晓彬儿子率队大胜:梦幻脚步+统治攻防,球商真高

社会故事回忆录
2024-06-15 10:33:58
不能实现全民免费医疗的根源:只有看不起病的人才渴望免费医疗

不能实现全民免费医疗的根源:只有看不起病的人才渴望免费医疗

雪中风车
2024-06-10 12:51:04
谭咏麟病愈后首次公开现身,瘦到青筋毕现感慨声线不好

谭咏麟病愈后首次公开现身,瘦到青筋毕现感慨声线不好

小萝卜天下事
2023-07-21 21:57:53
难怪有人对父母感到心寒!看了网友的分享,心酸得想大哭一场

难怪有人对父母感到心寒!看了网友的分享,心酸得想大哭一场

镜头时光
2024-06-11 00:54:32
湖南:小伙捧鲜花表白女技师,做足疗一见钟情,网友:长得很哇塞

湖南:小伙捧鲜花表白女技师,做足疗一见钟情,网友:长得很哇塞

百晓史
2024-06-02 09:09:36
均衡,日本男女三大球代表队均已获得巴黎奥运会参赛资格

均衡,日本男女三大球代表队均已获得巴黎奥运会参赛资格

懂球帝
2024-06-15 15:49:11
美女模特,蜂腰大长腿,凹凸有致,请你吃晚饭你去不去

美女模特,蜂腰大长腿,凹凸有致,请你吃晚饭你去不去

傲娇的马甲线
2024-06-13 17:30:03
马来西亚总理:马来西亚加强对华关系是有道理的,因为中国“愿意接纳和倾听”

马来西亚总理:马来西亚加强对华关系是有道理的,因为中国“愿意接纳和倾听”

环球网资讯
2024-06-15 16:21:52
詹俊:克罗地亚中场三奇控传强可惜年龄偏大,无球正面防守偏弱

詹俊:克罗地亚中场三奇控传强可惜年龄偏大,无球正面防守偏弱

直播吧
2024-06-16 00:54:14
张天爱自拍大秀“凶器”,身材气质绝佳!曾和娜扎联手锤渣男?

张天爱自拍大秀“凶器”,身材气质绝佳!曾和娜扎联手锤渣男?

狐飞火
2024-06-15 00:40:03
美国总统拜登批准俄克拉何马州重大灾难声明

美国总统拜登批准俄克拉何马州重大灾难声明

财联社
2024-06-15 10:10:30
永久禁止出口欧美!拜登不淡定了,中国突然亮出关键“大杀器”

永久禁止出口欧美!拜登不淡定了,中国突然亮出关键“大杀器”

星辰故事屋
2024-06-11 19:23:42
凯特王妃重返公众视野,与王室成员的聊天被唇语解读

凯特王妃重返公众视野,与王室成员的聊天被唇语解读

土澳的故事
2024-06-15 23:09:09
6月15日,以军基地被炸,土耳其不宣而战,菲律宾船员弃船逃生

6月15日,以军基地被炸,土耳其不宣而战,菲律宾船员弃船逃生

笔墨V
2024-06-15 22:49:39
感觉刘亦菲在血洗内娱啊,这个才是真正健康美。

感觉刘亦菲在血洗内娱啊,这个才是真正健康美。

综艺拼盘汇
2024-06-15 18:42:49
2024-06-16 11:28:49
数据结构和算法
数据结构和算法
专门介绍和写算法题解的号
32文章数 0关注度
往期回顾 全部

头条要闻

40余套房屋涉嫌"一房多卖" 有购房者内心积郁因病去世

头条要闻

40余套房屋涉嫌"一房多卖" 有购房者内心积郁因病去世

体育要闻

没人永远年轻 但青春如此无敌还是离谱了些

娱乐要闻

江宏杰秀儿女刺青,不怕刺激福原爱?

财经要闻

打断妻子多根肋骨 上市公司创始人被公诉

科技要闻

iPhone 16会杀死大模型APP吗?

汽车要闻

东风奕派eπ008售21.66万元 冰箱彩电都配齐

态度原创

本地
时尚
亲子
旅游
公开课

本地新闻

粽情一夏|海河龙舟赛,竟然成了外国人的大party!

中年女性还是穿连衣裙最有气质!裙摆过膝、腰部收紧,巨显瘦

亲子要闻

家庭教育争议:青春期孩子该如何管教?

旅游要闻

@毕业生,江苏这些景区可享免票或优惠

公开课

近视只是视力差?小心并发症

无障碍浏览 进入关怀版