当前位置: 首页 > java >正文

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

卡码网题目:

  • 99. 岛屿数量
  • 100. 岛屿的最大面积

其他:

今日总结
往期打卡


99. 岛屿数量

跳转: 99. 岛屿数量

学习: 代码随想录公开讲解

问题:

给定一个由 1(陆地)和 0(水)组成的矩阵,你需要计算岛屿的数量。岛屿由水平方向或垂直方向上相邻的陆地连接而成,并且四周都是水域。你可以假设矩阵外均被水包围。

思路:

Flood Fill求连通区域数量,可以使用bfs或dfs遍历地图,bfs需要及时标记,处理时再标记会重复添加.

复杂度:

  • 时间复杂度: O ( n m ) O(nm) O(nm)
  • 空间复杂度: O ( n m ) O(nm) O(nm)

代码:

import java.util.ArrayDeque;
import java.util.Deque;
import java.util.Scanner;class Main {private static int ans;private static int[][] DIRECTION = {{0, -1}, {1, 0}, {0, 1}, {-1, 0}};private static boolean[][] vis;private static void dfs(int[][] map, int x, int y) {vis[x][y] = true;for (int i = 0; i < 4; i++) {int n = x + DIRECTION[i][0];int m = y + DIRECTION[i][1];if (n < 0 || n >= map.length || m < 0 || m >= map[0].length || vis[n][m]) continue;if (map[n][m] == 1)dfs(map, n, m);}}private static void bfs(int[][] map,int x,int y){Deque<int[]> stack = new ArrayDeque<>();vis[x][y] = true;stack.add(new int[]{x,y});while(!stack.isEmpty()){int l = stack.size();for(int i=0;i<l;i++){int[] position = stack.pollLast();for(int j=0;j<4;j++){int n = position[0] + DIRECTION[j][0];int m = position[1] + DIRECTION[j][1];if (n < 0 || n >= map.length || m < 0 || m >= map[0].length || vis[n][m]) continue;if (map[n][m] == 1){vis[n][m] = true;stack.add(new int[]{n,m});}}}}}public static void main(String[] args) {Scanner sc = new Scanner(System.in);int N = sc.nextInt();int M = sc.nextInt();int[][] map = new int[N][M];vis = new boolean[N][M];for (int i = 0; i < N; i++) {for (int j = 0; j < M; j++) {map[i][j] = sc.nextInt();}}for (int i = 0; i < N; i++) {for (int j = 0; j < M; j++) {if (map[i][j] == 0 || vis[i][j]) continue;ans++;bfs(map, i, j);}}System.out.println(ans);}
}

100. 岛屿的最大面积

跳转: 100. 岛屿的最大面积

学习: 代码随想录公开讲解

问题:

给定一个由 1(陆地)和 0(水)组成的矩阵,计算岛屿的最大面积。岛屿面积的计算方式为组成岛屿的陆地的总数。岛屿由水平方向或垂直方向上相邻的陆地连接而成,并且四周都是水域。你可以假设矩阵外均被水包围。

思路:

Flood Fill最大求连通区域长度,可以使用bfs或dfs遍历地图,bfs需要及时标记,处理时再标记会重复添加.

复杂度:

  • 时间复杂度: O ( n m ) O(nm) O(nm)
  • 空间复杂度: O ( n m ) O(nm) O(nm)

代码:

import java.util.*;class Main {private static int ans;private static int[][] DIRECTION = {{0, -1}, {1, 0}, {0, 1}, {-1, 0}};private static boolean[][] vis;private static int dfs(int[][] map, int x, int y) {vis[x][y] = true;int l = 0;for (int i = 0; i < 4; i++) {int n = x + DIRECTION[i][0];int m = y + DIRECTION[i][1];if (n < 0 || n >= map.length || m < 0 || m >= map[0].length || vis[n][m]) continue;if (map[n][m] == 1)l+= dfs(map, n, m);}return l;}private static int bfs(int[][] map,int x,int y){Queue<int[]> stack = new LinkedList<>();vis[x][y] = true;int len = 0;stack.add(new int[]{x,y});while(!stack.isEmpty()){int l = stack.size();len+=l;for(int i=0;i<l;i++){int[] position = stack.poll();for(int j=0;j<4;j++){int n = position[0] + DIRECTION[j][0];int m = position[1] + DIRECTION[j][1];if (n < 0 || n >= map.length || m < 0 || m >= map[0].length || vis[n][m]) continue;if (map[n][m] == 1){vis[n][m] = true;stack.add(new int[]{n,m});}}}}return len;}public static void main(String[] args) {Scanner sc = new Scanner(System.in);int N = sc.nextInt();int M = sc.nextInt();int[][] map = new int[N][M];vis = new boolean[N][M];for (int i = 0; i < N; i++) {for (int j = 0; j < M; j++) {map[i][j] = sc.nextInt();}}for (int i = 0; i < N; i++) {for (int j = 0; j < M; j++) {if (map[i][j] == 0 || vis[i][j]) continue;// ans++;int tmp = bfs(map, i, j);     //只要加入队列就代表走过,就需要标记,而不是从队列拿出来的时候再去标记走过。ans = Math.max(tmp,ans);}}System.out.println(ans);}
}

总结

练习了dfs,bfs求连通块问题,通过vis数组避免重复遍历,一遍遍历求得所有连通块

往期打卡

代码随想录算法训练营第四十二&四十三天

代码随想录算法训练营第四十一天

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

代码随想录算法训练营第三十九天

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

代码随想录算法训练营第三十七天

代码随想录算法训练营第三十五&三十六天

代码随想录算法训练营第三十四天

代码随想录算法训练营第三十三天(补)

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

代码随想录算法训练营第三十一天

代码随想录算法训练营第三十天(补)

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

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

代码随想录算法训练营第二十七天(补)

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

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

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

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

代码随想录算法训练营周末四

代码随想录算法训练营第二十二天(补)

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

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

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

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

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

代码随想录算法训练营周末三

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

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

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

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

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

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

代码随想录算法训练营周末二

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

代码随想录算法训练营第九天

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

代码随想录算法训练营第七天

代码随想录算法训练营第六天

代码随想录算法训练营第五天

代码随想录算法训练营周末一

代码随想录算法训练营第四天

代码随想录算法训练营第三天

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

代码随想录算法训练营第一天

http://www.xdnf.cn/news/7327.html

相关文章:

  • 企业网站架构部署与优化 --web技术与nginx网站环境部署
  • uWSGI、IIS、Tomcat有啥区别?
  • Linux 内核等待机制详解:prepare_to_wait_exclusive 与 TASK_INTERRUPTIBLE
  • day 21 常见降维算法
  • R²AIN SUITE 亮相第九届智能工厂高峰论坛
  • 基于DolphinScheduler抽取通用EventBus组件:支持延迟与事件驱动
  • centos把jar包配置成服务并设置开机自启
  • 基于ac自动机的内容审核
  • PyTorch模型保存方式
  • C++ —— Lambda 表达式
  • 虚拟地址空间
  • 第四章、SKRL(1): Examples
  • Python实例题:Python 实现简易 Shell
  • Python的传参过程的小细节
  • 什么是5G前传、中传、回传?
  • 数据分析—Excel数据清洗函数
  • Compose Kotlin Multiplatform跨平台基础运行
  • CM0启动CM7_0、CM7_1注意事项
  • PCB设计教程【入门篇】——电路分析基础-基本元件(电阻电容电感)
  • Docker 入门指南:从安装配置到核心概念解析
  • [ 计算机网络 ] | 宏观谈谈计算机网络
  • 十三、Hive 行列转换
  • 计算机视觉与深度学习 | Python实现ARIMA-WOA-CNN-LSTM时间序列预测(完整源码和数据
  • netcore项目使用winforms与blazor结合来开发如何按F12,可以调出chrome devtool工具辅助开发
  • 通过低功耗蓝牙通信实例讲透 MCU 各个定时器
  • AT 指令详解:基于 MCU 的通信控制实战指南AT 指令详解
  • ESP32开发-两个WIFI设备的通讯搭建
  • AI大模型从0到1记录学习numpy pandas day25
  • 无人设备遥控器之数据压缩与编码技术篇
  • PLC组网的方法、要点及实施全解析