题目

类型:BFS

image.png

解题思路

什么样的方块一定可以接住水:

  • 该方块不为最外层的方块;
  • 该方块自身的高度比其上下左右四个相邻的方块接水后的高度都要低;

image.png

代码

  1. package breadthFirstSearch;
  2. import java.util.LinkedList;
  3. import java.util.Queue;
  4. public class TrappingRainWaterII {
  5. public int trapRainWater(int[][] heightMap) {
  6. int m = heightMap.length;
  7. int n = heightMap[0].length;
  8. int[] dirs = {-1, 0, 1, 0, -1};
  9. int maxHeight = 0;
  10. for (int i = 0; i < m; ++i) {
  11. for (int j = 0; j < n; ++j) {
  12. maxHeight = Math.max(maxHeight, heightMap[i][j]);
  13. }
  14. }
  15. int[][] water = new int[m][n];
  16. for (int i = 0; i < m; ++i) {
  17. for (int j = 0; j < n; ++j){
  18. water[i][j] = maxHeight;
  19. }
  20. }
  21. Queue<int[]> qu = new LinkedList<>();
  22. for (int i = 0; i < m; ++i) {
  23. for (int j = 0; j < n; ++j) {
  24. if (i == 0 || i == m - 1 || j == 0 || j == n - 1) {
  25. if (water[i][j] > heightMap[i][j]) {
  26. water[i][j] = heightMap[i][j];
  27. qu.offer(new int[]{i, j});
  28. }
  29. }
  30. }
  31. }
  32. while (!qu.isEmpty()) {
  33. int[] curr = qu.poll();
  34. int x = curr[0];
  35. int y = curr[1];
  36. for (int i = 0; i < 4; ++i) {
  37. int nx = x + dirs[i], ny = y + dirs[i + 1];
  38. if (nx < 0 || nx >= m || ny < 0 || ny >= n) {
  39. continue;
  40. }
  41. if (water[x][y] < water[nx][ny] && water[nx][ny] > heightMap[nx][ny]) {
  42. water[nx][ny] = Math.max(water[x][y], heightMap[nx][ny]);
  43. qu.offer(new int[]{nx, ny});
  44. }
  45. }
  46. }
  47. int res = 0;
  48. for (int i = 0; i < m; ++i) {
  49. for (int j = 0; j < n; ++j) {
  50. res += water[i][j] - heightMap[i][j];
  51. }
  52. }
  53. return res;
  54. }
  55. }