【016·暴力解】1765. 地图中的最高点【多源BFS】
创始人
2024-05-10 17:06:38
0

地图中的最高点

给你一个大小为 m x n 的整数矩阵 isWater ,它代表了一个由 陆地 和 水域 单元格组成的地图。
如果 isWater[i][j] == 0 ,格子 (i, j) 是一个 陆地 格子。
如果 isWater[i][j] == 1 ,格子 (i,j) 是一个 水域 格子。
你需要按照如下规则给每个单元格安排高度:
每个格子的高度都必须是非负的。
如果一个格子是 水域,那么它的高度必须为 0 。
任意相邻的格子高度差 至多 为 1。当两个格子在正东、南、西、北方向上相互紧挨着,就称它们为相邻的格子。(也就是说它们有一条公共边)
找到一种安排高度的方案,使得矩阵中的最高高度值 最大 。 请你返回一个大小为 m x n 的整数矩阵 height ,其中height[i][j] 是格子 (i, j) 的高度。如果有多种解法,请返回 任意一个 。

https://leetcode.cn/problems/map-of-highest-peak/

  1. 多源BFS:时间复杂度n方,执行时间缩短 97.3% : 1900ms - 50ms
  2. 水源索引入队,BFS层层遍历

菜鸡解:

/** Copyright (c) Huawei Technologies Co., Ltd. 2023-2023. All rights reserved.*/package com.huawei.prac;import java.util.Arrays;class SolutionSt {public static void main(String[] args) {int[][] isWater = new int[][] {{0, 0, 1}, {1, 0, 0}, {0, 0, 0}};for (int[] arr : isWater) {Arrays.stream(arr).forEach(System.out::print);System.out.println();}System.out.println("============================");int[][] resArr = highestPeak(isWater);for (int[] arr : resArr) {Arrays.stream(arr).forEach(System.out::print);System.out.println();}}/*** 765. 地图中的最高点* 三层循环,味同嚼蜡,目不忍视** @param isWater 陆地水域地图二维数组* @return 高度矩阵,使得矩阵中的最高高度值 最大*/public static int[][] highestPeak(int[][] isWater) {boolean isExist;int maxVal = 1;int row = isWater.length;int col = isWater[0].length;boolean[][] visited = new boolean[row][col];for (int i = 0; i < maxVal; i++) {isExist = isChangeMatrix(isWater, maxVal, visited);maxVal = isExist ? maxVal + 1 : maxVal;}for (int i = 0; i < row; i++) {for (int j = 0; j < col; j++) {isWater[i][j] -= 1;}}return isWater;}private static boolean isChangeMatrix(int[][] isWater, int maxVal, boolean[][] visited) {int row = isWater.length;int col = isWater[0].length;boolean isExist = false;for (int j = 0; j < row; j++) {for (int k = 0; k < col; k++) {if (isWater[j][k] == maxVal) {isExist = isChange(isWater, maxVal, visited, row, col, isExist, j, k);}}}return isExist;}private static boolean isChange(int[][] isWater, int maxVal, boolean[][] visited, int row, int col, boolean isExist,int j, int k) {visited[j][k] = true;if (j - 1 >= 0 && !visited[j - 1][k] && isWater[j - 1][k] != maxVal) {isWater[j - 1][k] = maxVal + 1;visited[j - 1][k] = true;isExist = true;}if (j + 1 < row && !visited[j + 1][k] && isWater[j + 1][k] != maxVal) {isWater[j + 1][k] = maxVal + 1;visited[j + 1][k] = true;isExist = true;}if (k - 1 >= 0 && !visited[j][k - 1] && isWater[j][k - 1] != maxVal) {isWater[j][k - 1] = maxVal + 1;visited[j][k - 1] = true;isExist = true;}if (k + 1 < col && !visited[j][k + 1] && isWater[j][k + 1] != maxVal) {isWater[j][k + 1] = maxVal + 1;visited[j][k + 1] = true;isExist = true;}return isExist;}
}

大佬解

/** Copyright (c) Huawei Technologies Co., Ltd. 2023-2023. All rights reserved.*/package com.huawei.prac;import java.util.ArrayDeque;
import java.util.Arrays;
import java.util.Queue;class SolutionRd {public static void main(String[] args) {int[][] isWater = new int[][] {{0, 0, 1}, {1, 0, 0}, {0, 0, 0}};for (int[] arr : isWater) {Arrays.stream(arr).forEach(System.out::print);System.out.println();}System.out.println("============================");int[][] resArr = highestPeak(isWater);for (int[] arr : resArr) {Arrays.stream(arr).forEach(System.out::print);System.out.println();}}/*** 765. 地图中的最高点[多源BFS]* 时间复杂度n方,执行时间缩短 97.3% : 1900ms - 50ms** @param isWater 陆地水域地图二维数组* @return 高度矩阵,使得矩阵中的最高高度值 最大*/public static int[][] highestPeak(int[][] isWater) {Queue queue = new ArrayDeque<>();int[][] resArr = new int[isWater.length][isWater[0].length];// 上 下 左 右 移动int[][] direc = new int[][] {{-1, 0}, {1, 0}, {0, -1}, {0, 1}};// 水源入队,陆地赋值-1for (int i = 0; i < isWater.length; i++) {for (int j = 0; j < isWater[0].length; j++) {if (isWater[i][j] == 1) {queue.offer(new int[] {i, j});} else {resArr[i][j] = -1;}}}// BFSwhile (!queue.isEmpty()) {int[] arr = queue.poll();for (int[] ints : direc) {int rowNext = arr[0] + ints[0];int colNext = arr[1] + ints[1];if (invalid(rowNext, colNext, resArr)) {continue;}resArr[rowNext][colNext] = resArr[arr[0]][arr[1]] + 1;queue.offer(new int[] {rowNext, colNext});}}return resArr;}private static boolean invalid(int rowNext, int colNext, int[][] arr) {return rowNext >= arr.length || rowNext < 0 || colNext >= arr[0].length || colNext < 0|| arr[rowNext][colNext] != -1;}
}

相关内容

热门资讯

捷豹安卓系统车载,捷豹安卓系统... 哇,你有没有想过,当你的手机和汽车融为一体,会是怎样的体验呢?想象你正驾驶着你的捷豹,车窗外的风景如...
安卓1到10系统,安卓1.0至... 你有没有想过,手机里的安卓系统就像是我们生活中的好朋友,从青涩的少年成长为稳重的青年呢?从安卓1.0...
安卓8.0停用系统应用,提升使... 你知道吗?最近安卓系统又来了一次大动作,那就是安卓8.0系统开始停用一些系统应用了。这可真是让人有点...
安卓系统修改mtu值,轻松提升... 你有没有想过,你的安卓手机其实是个小小的电脑呢?它里面藏着许多可以自定义的秘密功能,就像修改MTU值...
安卓平板改window系统,探... 你有没有想过,你的安卓平板其实可以摇身一变,变成一个Windows系统的电脑呢?没错,就是那种可以运...
时空猎人安卓苹果系统,探索无尽... 你知道吗?最近在手机游戏圈里,有一款叫做《时空猎人》的游戏可是火得一塌糊涂呢!不管是安卓用户还是苹果...
安卓9.0系统的电视,新一代电... 亲爱的读者们,你是否也像我一样,对科技新玩意儿充满好奇?今天,我要和你聊聊一个让人眼前一亮的话题——...
小pc安装安卓系统,轻松安装安... 你有没有想过,你的小PC也能变身成为安卓系统的超级玩家呢?没错,就是那个平时默默无闻的小家伙,现在也...
高通备份安卓系统,全方位数据安... 你知道吗?在这个科技飞速发展的时代,手机备份可是个不得不提的话题。尤其是对于安卓用户来说,选择一个靠...
谷歌安卓系统有多少,从诞生到全... 你有没有想过,那个无处不在的谷歌安卓系统,究竟在全球有多少用户呢?它就像一个神秘的数字,每天都在悄悄...
fc黄金传说安卓系统,畅享复古... 你有没有听说最近安卓系统上的一款超酷的游戏——《FC黄金传说》?这款游戏可是让不少玩家都沉迷其中,今...
变小的我安卓系统,安卓系统演变... 你有没有发现,最近你的手机好像变轻了?没错,说的就是你,那个陪伴你多年的安卓系统。它悄无声息地进行了...
vivo安卓系统小彩蛋,体验科... 你知道吗?在vivo的安卓系统中,竟然隐藏着一些超有趣的小彩蛋!这些小彩蛋就像是在手机里埋下的宝藏,...
安卓系统如何强制重启,安卓系统... 手机突然卡壳了,是不是又该给它来个“大保健”了?没错,今天就来聊聊安卓系统如何强制重启。别小看这个看...
全民飞行团安卓系统,体验指尖上... 你知道吗?最近在手机游戏圈里,有个叫做“全民飞行团”的新星正在闪耀!这款游戏不仅吸引了无数玩家的目光...
安卓鸿蒙系统壁纸软件,壁纸软件... 亲爱的手机控们,你是否厌倦了单调的壁纸?想要给你的安卓手机换上充满科技感的鸿蒙系统风格壁纸?那就跟我...
安卓系统ram重新分区,提升系... 你有没有发现,你的安卓手机最近有点儿卡呢?别急,别急,今天就来给你揭秘如何给安卓系统的RAM来个重新...
迷你退出安卓系统了吗,转型新篇... 最近有没有发现你的手机上那个可爱的迷你退出图标突然不见了?别急,让我来给你揭秘迷你退出安卓系统了吗的...
华为优先使用安卓系统,打造自主... 你知道吗?最近科技圈里有个大动作,那就是华为宣布优先使用安卓系统。这可不是一个简单的决定,它背后可是...
安卓系统隐藏了设置,隐藏设置功... 你知道吗?安卓系统这个大宝藏里,竟然隐藏着一些不为人知的设置!是不是听起来就有点小激动呢?别急,今天...