【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;}
}

相关内容

热门资讯

findx耍原生安卓系统,深度... 亲爱的读者们,你是否厌倦了那些花里胡哨的定制系统,渴望回到那个纯净的安卓世界?今天,我要带你一起探索...
一加系统属于安卓系统吗,引领智... 你有没有想过,手机里的那个神奇的“一加系统”到底是不是安卓系统的一员呢?这可是个让人好奇不已的问题哦...
小米2刷安卓系统吗,探索安卓系... 亲爱的读者,你是否曾经对小米2这款手机刷安卓系统的事情感到好奇呢?今天,就让我带你一探究竟,揭开小米...
安卓7.0系统线刷包,深度解析... 你有没有发现,你的安卓手机最近有点儿“蔫儿”了?别急,别急,今天就来给你揭秘如何让你的安卓手机重焕生...
白菜系统和安卓拍照,开启智能生... 你知道吗?最近我在用手机拍照的时候,发现了一个超级酷的功能,简直让我爱不释手!那就是——白菜系统和安...
安卓系统查杀病毒,全方位守护您... 手机里的安卓系统是不是有时候会突然弹出一个查杀病毒的提示?别慌,这可不是什么大问题,今天就来给你详细...
iso系统与安卓各系统哪个好,... 你有没有想过,手机操作系统就像是我们生活中的不同交通工具,各有各的特色和优势。今天,咱们就来聊聊这个...
中柏怎么换安卓系统,解锁更多可... 你有没有发现,中柏的安卓系统有时候用起来还挺不顺手的?别急,今天就来手把手教你如何给中柏手机升级安卓...
安卓热点绕过系统验证,揭秘操作... 你是不是也遇到过这种情况?手机里的安卓热点突然不灵光了,系统验证总是跳出来,让人头疼不已。别急,今天...
安卓系统怎么关闭小艺,安卓系统... 亲爱的安卓用户们,你是否也和我一样,对手机里的小艺助手有些爱恨交加呢?有时候,它贴心得让人感动,有时...
安卓系统计划软件推荐,精选计划... 你有没有发现,手机里的安卓系统越来越智能了?这不,最近我可是挖到了一些超棒的安卓计划软件,它们不仅能...
收钱吧安卓系统插件,便捷支付新... 你有没有发现,现在的生活越来越离不开手机了?手机里装满了各种应用,而今天我要跟你聊聊一个特别实用的工...
鸿蒙系统是否还属于安卓,独立于... 你有没有想过,那个在我们手机上默默无闻的鸿蒙系统,它到底是不是安卓的“亲戚”呢?这个问题,估计不少手...
安卓系统手机用什么钱包,轻松管... 你有没有想过,你的安卓系统手机里装了那么多应用,但最离不开的,可能就是那个小小的钱包了。没错,就是那...
安卓系统能玩部落冲突吗,部落冲... 你有没有想过,安卓系统上的手机,是不是也能玩那款风靡全球的《部落冲突》呢?这款游戏自从推出以来,就吸...
智能机器人安卓系统,引领未来智... 你知道吗?在科技飞速发展的今天,智能机器人已经不再是科幻电影里的专属了。它们正悄悄地走进我们的生活,...
华为win10系统改装安卓系统... 你有没有想过,你的华为笔记本电脑里的Windows 10系统,能不能来个华丽变身,变成安卓系统呢?这...
旧电脑上安什么安卓系统,适配不... 你那台旧电脑是不是已经闲置好久了?别让它默默无闻地躺在角落里,给它来个华丽变身吧!今天,就让我来告诉...
安卓app语言跟随系统,随系统... 你知道吗?在手机世界里,有一个神奇的小功能,它就像你的贴身翻译官,无论你走到哪里,都能帮你轻松应对各...
惠城安卓系统降级在哪,揭秘降级... 你有没有遇到过手机系统升级后,发现新系统让你头疼不已,想回到那个熟悉的安卓系统呢?别急,今天就来告诉...