Leetcode 407.接雨水

接雨水

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

说明:

都是小于110的整数。每一个单位的高度都大于0 且小于 20000。

示例:

给出如下 3x6 的高度图:

[

[1,4,3,1,3,2],

[3,2,1,3,2,4],

[2,3,3,2,3,1]

]

返回 4。

如上图所示,这是下雨前的高度图[[1,4,3,1,3,2],[3,2,1,3,2,4],[2,3,3,2,3,1]] 的状态。

下雨后,雨水将会被存储在这些方块中。总的接雨水量是4。

三维的装水的问题,主要思路还是从边缘的地方开始找。

priorityqueue每次poll出最高优先级的元素,也就是目前height最底的元素。

对于visit之后的元素来说,新的高度是要updata的,要么保持原样,要么变成装了水之后的高度。

 1 import java.util.Comparator;
 2 import java.util.PriorityQueue;
 3
 4 public class Solution {
 5
 6     private static class Cell {
 7         private int row;
 8         private int col;
 9         private int height;
10
11         public Cell(int row, int col, int height){
12             this.row = row;
13             this.col = col;
14             this.height = height;
15         }
16     }
17
18
19     public static int trapRainWater(int[][] heightMap) {
20         if(heightMap == null || heightMap.length == 0 ||heightMap[0].length == 0) {
21             return 0;
22         }
23
24         PriorityQueue<Cell> queue = new PriorityQueue<>(1, new Comparator<Cell>(){
25             public int compare(Cell a, Cell b) {
26                 return a.height - b.height;
27             }
28         });
29
30         int m = heightMap.length;
31         int n = heightMap[0].length;
32         boolean[][] visited = new boolean[m][n];
33
34         for (int i = 0; i< m ;i++){
35             visited[i][0] = true;
36             visited[i][n-1] = true;
37             queue.offer(new Cell(i, 0, heightMap[i][0]));
38             queue.offer(new Cell(i, n-1, heightMap[i][n-1]));
39         }
40
41         for (int i = 0; i< n ;i++){
42             visited[0][i] = true;
43             visited[m-1][i] = true;
44             queue.offer(new Cell(0, i, heightMap[0][i]));
45             queue.offer(new Cell(m-1, i, heightMap[m-1][i]));
46         }
47
48
49
50         int[][] dirs = new int[][]{{-1,0},{1,0},{0,-1},{0,1}};
51         int res = 0;
52         while(!queue.isEmpty()){
53             Cell cell = queue.poll();
54             for(int[] dir : dirs){
55                 int row = cell.row + dir[0];
56                 int col = cell.col + dir[1];
57                 if(row >= 0 && row < m && col >=0 && col < n && !visited[row][col]){
58                     visited[row][col] = true;
59                     res += Math.max(0,cell.height - heightMap[row][col]);
60                     queue.offer(new Cell(row,col,Math.max(heightMap[row][col],cell.height)));
61                 }
62             }
63         }
64         return res;
65     }
66
67     public static void main(String[] args){
68         int[][] heightMap={{1,4,3,1,3,2},{3,2,1,3,2,4},{2,3,3,2,3,1}};
69         trapRainWater(heightMap);
70     }
71 }
																																																																																																																																																																																																	int[][] heightMap={{1,4,3,1,3,2},{3,2,1,3,2,4},{2,3,3,2,3,1}};
																																																																																																																																																																																																																																															trapRainWater(heightMap);    }}

原文地址:https://www.cnblogs.com/kexinxin/p/10241839.html

时间: 2024-10-16 10:58:19

Leetcode 407.接雨水的相关文章

LeetCode:接雨水【42】

LeetCode:接雨水[42] 题目描述 给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水. 上面是由数组 [0,1,0,2,1,0,1,3,2,1,2,1] 表示的高度图,在这种情况下,可以接 6 个单位的雨水(蓝色部分表示雨水). 感谢 Marcos 贡献此图. 示例: 输入: [0,1,0,2,1,0,1,3,2,1,2,1] 输出: 6 题目分析 找出最高点 分别从两边往最高点遍历:如果下一个数比当前数小,说明可以接到水 Java题解 c

[leetcode] 42. 接雨水

42. 接雨水 思路:一块柱子能接水的量取决于它左右两边最高的柱子中较短的一个. class Solution { public int trap(int[] height) { int left[] = new int[height.length]; int right[] = new int[height.length]; int max = 0; for (int i = 0; i < height.length; i++) { max = Math.max(max, height[i])

【leet-code】接雨水

给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水. 上面是由数组 [0,1,0,2,1,0,1,3,2,1,2,1] 表示的高度图,在这种情况下,可以接 6 个单位的雨水(蓝色部分表示雨水). 感谢 Marcos 贡献此图. 示例: 输入: [0,1,0,2,1,0,1,3,2,1,2,1] 输出: 6 分析: 解法1:暴力法 对每个元素取其左右两边的最大值的最小值,然后减去当前值 时间复杂度:O(N^2),对每个元素都需要取其左右两边的最大值 空

Leetcode 407. Trapping Rain Water II

Given an m x n matrix of positive integers representing the height of each unit cell in a 2D elevation map, compute the volume of water it is able to trap after raining. Note:Both m and n are less than 110. The height of each unit cell is greater tha

leet

# 题名1 两数之和    2 两数相加    3 无重复字符的最长子串    4 寻找两个有序数组的中位数    5 最长回文子串    6 Z 字形变换    7 整数反转    8 字符串转换整数 (atoi)    9 回文数    10 正则表达式匹配    11 盛最多水的容器    12 整数转罗马数字    13 罗马数字转整数    14 最长公共前缀    15 三数之和    16 最接近的三数之和    17 电话号码的字母组合    18 四数之和    19 删除链表

leetcode接雨水问题的总结

题目:leetcode 42题 解法一:动态规划 int trap(vector<int>& height) { int ans = 0; int size = height.size(); if(size) { vector<int> max_left(size); vector<int> max_right(size); max_left[0] = height[0]; max_right[size-1] = height[size-1]; for(int

[LeetCode]101. Trapping Rain Water收集雨水

Given n non-negative integers representing an elevation map where the width of each bar is 1, compute how much water it is able to trap after raining. For example, Given [0,1,0,2,1,0,1,3,2,1,2,1], return 6. The above elevation map is represented by a

leetcode python 042收集雨水

'''给定n个非负整数表示每个条的宽度为1的高程图,计算下雨后能够捕获多少水.例如,鉴于[0,1,0,2,1,0,1,3,2,1,2,1],返回6.这个题要先算出盛满水后的高程图,减去前者就是雨水.盛水多高取决于左右最高的两处低的一方.'''l1=[0,1,0,2,1,0,1,3,2,1,2,1]w=[]for i in range(len(l1)):    w.append(min(max(l1[0:i+1]),max(l1[i:]))-l1[i])print('收集雨水:',sum(w))

[ Leetcode ] No.42 接雨水

题目: 给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水. 示例: 输入: [0,1,0,2,1,0,1,3,2,1,2,1] 输出: 6 解题思路: 首先构建两个栈,h存高度,idx存下标. 遍历数组,将height[i]与h.top()做比较 若height[i] <= h.top(),则将对应的高度和下标都入栈. 若height[i] > h.top(),则表明可能可以求得面积. 实际上,对于index = k的方块而言,可能接住的雨水等于