day 65 图论part02 99.岛屿数量 深搜 99.岛屿数量 广搜 100.岛屿的最大面积

 99.岛屿数量 深搜  

每座岛屿只能由水平方向和/或竖直方向上相邻的陆地连接形成。

本题思路,是用遇到一个没有遍历过的节点陆地,计数器就加一,然后把该节点陆地所能遍历到的陆地都标记上。

在遇到标记过的陆地节点和海洋节点的时候直接跳过。 这样计数器就是最终岛屿的数量。

那么如何把节点陆地所能遍历到的陆地都标记上呢,就可以使用 DFS,BFS或者并查集。

import java.util.*;public class Main {static int[][] dirs = {{1, 0}, {-1, 0}, {0, 1}, {0, -1}};static int ans = 0;static boolean[][] visited;public static void main(String[] args) {Scanner sc = new Scanner(System.in);int n = sc.nextInt();int m = sc.nextInt();int[][] graph = new int[n][m];for (int i = 0; i < n; i++) {for (int j = 0; j < m; j++) {graph[i][j] = sc.nextInt();}}visited = new boolean[n][m];for (int i = 0; i < n; i++) {for (int j = 0; j < m; j++) {if(!visited[i][j] && graph[i][j] == 1){bfs(i,j,graph,n,m);ans++;}}}System.out.println(ans);}private static void bfs(int row, int col, int[][] graph, int n, int m) {if (visited[row][col]){return;}visited[row][col] = true;for (int[] dir : dirs) {int nextR = dir[0] + row;int nextC = dir[1] + col;if (nextR >= 0 && nextR < n && nextC >= 0 && nextC < m){if (graph[nextR][nextC] == 1){bfs(nextR,nextC,graph,n,m);}}}}
}

广搜

class Solution {public int numIslands(char[][] grid) {int count = 0;for(int i = 0; i < grid.length; i++) {for(int j = 0; j < grid[0].length; j++) {if(grid[i][j] == '1'){bfs(grid, i, j);count++;}}}return count;}private void bfs(char[][] grid, int i, int j){Queue<int[]> list = new LinkedList<>();list.add(new int[] { i, j });while(!list.isEmpty()){int[] cur = list.remove();i = cur[0]; j = cur[1];if(0 <= i && i < grid.length && 0 <= j && j < grid[0].length && grid[i][j] == '1') {grid[i][j] = '0';list.add(new int[] { i + 1, j });list.add(new int[] { i - 1, j });list.add(new int[] { i, j + 1 });list.add(new int[] { i, j - 1 });}}}
}

 100.岛屿的最大面积 

public class Main {static int[][] dirs = {{1,0},{-1,0},{0,1},{0,-1}};static boolean[][] visited;static int ans = Integer.MIN_VALUE;static int temp;public static void main(String[] args) {Scanner sc = new Scanner(System.in);int n = sc.nextInt();int m = sc.nextInt();int[][] graph = new int[n][m];visited = new boolean[n][m];// 初始化for (int i = 0; i < n; i++) {for (int j = 0; j < m; j++) {graph[i][j] = sc.nextInt();}}for (int i = 0; i < n; i++) {for (int j = 0; j < m; j++) {if (!visited[i][j] && graph[i][j] == 1){temp = 0;bfs(i, j, n, m, graph);ans = Math.max(ans, temp);}}}System.out.printf("%d", ans == Integer.MIN_VALUE ? 0:ans);}private static void dfs(int row, int col, int n, int m, int[][] graph) {if (visited[row][col]){return;}visited[row][col] = true;temp++;for (int[] dir : dirs) {int nextR = row + dir[0];int nextC = col + dir[1];if(nextR >= 0 && nextR < n && nextC >= 0 && nextC < m && graph[nextR][nextC] == 1){bfs(nextR,nextC,n,m,graph);}}}}
class Solution {public int maxAreaOfIsland(int[][] grid) {int res = 0;for(int i = 0; i < grid.length; i++){for(int j = 0; j < grid[0].length; j++){if(grid[i][j] == 1){res = Math.max(res, bfs(grid, i, j));}   }}return res;}public int bfs(int[][] grid, int i, int j){int[] dx = {1, -1, 0, 0};int[] dy = {0, 0, 1, -1};Queue<int[]> queue = new LinkedList<>();queue.offer(new int[]{i, j});grid[i][j] = 0;int area = 1;while(!queue.isEmpty()){int[] x = queue.poll();for(int index = 0; index < 4; index++){int nx = x[0] + dx[index], ny = x[1] + dy[index];if(nx>=0 && nx < grid.length && ny >= 0 && ny < grid[0].length && grid[nx][ny] == 1){grid[nx][ny] = 0;area += 1;queue.offer(new int[]{nx, ny});}}}return area;}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/33607.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Vue3 响应式 reactive全家桶

reactive()与ref()的区别和连续 ref和reactive都是把变量变成响应式对象 reactive底层使用了泛型约束&#xff0c;只能对引用类型使用。 而ref支持所有的类型&#xff0c;ref取值和赋值都需要 .value 而reactive 不需要 对象 <template><div><form><…

【运维】在 Docker 容器中指定 UTF-8 编码:方法与技巧

在 Docker 容器中指定 UTF-8 编码&#xff1a;方法与技巧 在日常开发中&#xff0c;我们常常需要确保应用程序能正确处理各种字符编码&#xff0c;尤其是 UTF-8 编码。在 Docker 容器中运行应用程序时&#xff0c;正确设置字符编码尤为重要&#xff0c;因为容器通常是跨平台、…

达梦(DM8)数据库表空间的备份与还原(联机备份) 四

一、表空间的备份 1、备份表空间的命令操作 backup tablespace main backupset /home/dmdba/dmdata/DAMENG/bak/full_back_01 ; 2、检查表空间的备份文件 select sf_bakset_check(disk,/home/dmdba/dmdata/DAMENG/bak/full_back_01); 二、表空间的还原 1、修改表空间位脱机…

AI播客下载:Edge of AI (AI最新应用场景和发展趋势)

Edge of AI Podcast 是一个探讨人工智能&#xff08;AI&#xff09;最新应用和发展的播客。该播客由Ron Levy主持&#xff0c;他于2023年8月9日接任新主持人。每个节目都会邀请专家分享他们在AI领域的见解和经验&#xff0c;探索最新的应用场景和发展趋势。例如&#xff0c;在第…

PointCloudLib 法线微分算法(Don)分割点云 C++版本

0.实现效果 原始点云 不同尺度上计算法向量 计算出don特征量,并以颜色显示在点云上 可以看出平面中心的点 不涉及到周围点变化的点 特征量比较低,以红色表示 边缘过渡剧烈的点,特征量比较高,以蓝色表示 以Don算法特征量来作为阈值分割点云,可以分割出剧烈变化的点云 欧…

《Linux Vim急救手册:E138错误全攻略与故障排除秘籍》

标题&#xff1a;《Linux Vim急救手册&#xff1a;E138错误全攻略与故障排除秘籍》 引言 在Linux世界中&#xff0c;Vim是编辑器的瑞士军刀&#xff0c;以其轻量级、强大和灵活著称。然而&#xff0c;即使是最熟练的Vim用户也可能遇到令人头疼的E138错误。本文将深入探讨Vim …

国标GB28181视频汇聚平台EasyCVR设备展示数量和显示条数不符的原因排查与解决

国标GB28181/GA/T1400协议/安防综合管理系统EasyCVR视频汇聚平台能在复杂的网络环境中&#xff0c;将前端设备统一集中接入与汇聚管理。智慧安防/视频存储/视频监控/视频汇聚EasyCVR平台可以提供实时远程视频监控、视频录像、录像回放与存储、告警、语音对讲、云台控制、平台级…

WDF驱动开发-特定于KMDF的技术(三)

支持特殊文件 特殊文件 包括分页文件、转储文件和休眠文件。 如果驱动程序的目标设备是系统可能用于这些文件的存储设备&#xff0c;则驱动程序必须执行以下操作&#xff1a; 调用 WdfDeviceSetSpecialFileSupport 以启用或禁用对每种类型的特殊文件的支持。 默认情况下禁用每…

Django教程(002):模板语法的使用

目录 1 字符串2 列表3 字典4 列表中是字典5 if语句6 案例&#xff1a;使用爬虫爬取联通新闻并在页面渲染 模板语法本质上&#xff1a;在HTML中写一些占位符&#xff0c;由数据对这些占位符进行替换和处理。模板语法主要是方便对方法返回的数据在前端进行渲染&#xff0c;这些数…

什么野指针(c++)

野指针定义 野指针&#xff08;Wild Pointer&#xff09;是指向不确定位置或者非法地址的指针。当一个指针指向的内存被释放后&#xff0c;如果没有将其设置为NULL&#xff0c;那么这个指针就变成了野指针。使用野指针会导致未定义行为&#xff0c;可能引发程序崩溃或数据损坏…

【Proteus仿真】【Arduino单片机】寻迹避障蓝牙遥控小车

文章目录 一、功能简介二、软件设计三、实验现象联系作者 一、功能简介 本项目使用Proteus8仿真Arduino单片机控制器&#xff0c;使LCD1602液晶&#xff0c;L298电机&#xff0c;直流电机&#xff0c;HC05/06蓝牙模块&#xff0c;HCSR04超声波&#xff0c;红外寻迹模块等。 主…

grafana Not saving new dashboard due to restricted database access

报错 grafana 容器日志报错 logger=provisioning.dashboard t=2024-06-21T07:40:54.307719612Z level=warn msg="dashboards provisioning provider has no database write permissions because of duplicates" provider=default orgId=1

数据结构与算法-【算法专项】Hash算法-2(HashMap+设计Hash+Hash应用+Hashmap常用方法)

数据结构与算法-Hash算法-2 5 HashMap&#xff08;又双叒叕提到红黑树动态扩容&#xff09;6 如何设计Hash7 Hash的应用8 HashMap源码&#xff08;又双叒叕&#xff09;构造方法&#xff1a;put方法&#xff1a;get方法&#xff1a;equals方法&#xff1a;containsKey方法&…

C++初学者指南-2.输入和输出---命令行参数

C初学者指南-2.输入和输出—命令行参数 文章目录 C初学者指南-2.输入和输出---命令行参数1.这是什么&为什么这样&#xff1f;2.如何在C中访问3.转换为std::string、int......4.字符串到数字的转换函数5.命令行参数解析库 1.这是什么&为什么这样&#xff1f; 程序调用后…

说说 SSL 的错误认识和不足之处

最近明月在学习折腾 LNMP 期间无意中建了一个 Typecho 的博客小站&#xff0c;近一周的折腾下来&#xff0c;收获真的不少&#xff0c;致使兴趣也越来越浓了&#xff0c;在升级 LNMP 的时候捎带手的给这个 Typecho 博客也启用了 SSL。并且开启了 memcached 和 OPcache 优化加速…

C++在VS2022开发Windows窗口程序1:第一个win窗口程序

Windows操作系统是由微软公司开发和维护的一系列图形化操作系统的统称。Windows操作系统主要用于个人计算机、笔记本电脑、平板电脑、服务器等设备上。Windows起源于Microsoft-DOS模拟环境&#xff0c;相比于DOS的指令化模式&#xff0c;Windows采用图形化的模式&#xff0c;因…

OkHttp框架源码深度剖析【Android热门框架分析第一弹】

OkHttp介绍 OkHttp是当下Android使用最频繁的网络请求框架&#xff0c;由Square公司开源。Google在Android4.4以后开始将源码中的HttpURLConnection底层实现替换为OKHttp&#xff0c;同时现在流行的Retrofit框架底层同样是使用OKHttp的。 源码传送门 优点: 支持Http1、Http…

[保姆级教程]uniapp设置字体引入字体格式

文章目录 在 UniApp 中设置和引入自定义字体&#xff08;如 .ttf、.woff、.woff2 等格式&#xff09;通常涉及几个步骤。 准备字体文件&#xff1a; 首先&#xff0c;你需要有字体文件。这些文件通常以 .ttf、.woff 或 .woff2 格式提供。确保有权使用这些字体&#xff0c;并遵守…

如何在Web开发中创建、删除和修改按钮:实用指南

在Web开发中&#xff0c;创建、删除和修改按钮是常见的用户交互元素&#xff0c;用于管理数据、改变状态或执行特定操作。本篇博客将介绍如何设计和实现这些按钮&#xff0c;以及一些实用的技巧和最佳实践。 创建按钮 创建按钮通常用于添加新数据或执行新操作。在HTML中&…

代码随想录算法训练营第二十八天

题目&#xff1a;134. 加油站 暴力方法 暴力的方法很明显就是O(n^2)的&#xff0c;遍历每一个加油站为起点的情况&#xff0c;模拟一圈。 如果跑了一圈&#xff0c;中途没有断油&#xff0c;而且最后油量大于等于0&#xff0c;说明这个起点是ok的。 暴力的方法思路比较简单…