每天一道题(岛屿类型问题)
时间:2021-08-25
本文章向大家介绍每天一道题(岛屿类型问题),主要包括每天一道题(岛屿类型问题)使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
岛屿类型的问题 -- 主要是 bfs + 一些处理方式
在这个问题中,几个关键点 **四联通 沉岛思想 bfs dfs **累加和沉岛的操作台 offer() 后开始操作,代表已经进队了
class Solution {
int[] dx = new int[]{1, 0, 0, -1};
int[] dy = new int[]{0, 1, -1, 0};
public int maxAreaOfIsland(int[][] grid) {
int ans = 0, cur = 1;
int m = grid.length, n = grid[0].length;
Queue<int[]> que = new LinkedList<>();
for (int i = 0; i < m; i ++) {
for (int j = 0; j < n; j ++) {
if (grid[i][j] == 1) {
que.offer(new int[]{i, j});
// 进行累加和沉岛的处理
cur ++;
grid[i][j] = 0;
// BFS
while (! que.isEmpty()) {
int[] cell = que.poll();
int x = cell[0], y = cell[1];
for (int k = 0; k < 4; k ++) {
int mx = x + dx[k], my = y + dy[k];
// 边界条件
if (mx >= 0 && mx < m && my >= 0 && my < n && grid[mx][my] == 1) {
que.offer(new int[]{mx, my});
// 累加 沉岛
cur ++;
grid[mx][my] = 0;
}
}
}
}
ans = Math.max(ans, cur);
cur = 1;
}
}
return ans;
}
}
还有 dfs 的方法,两个方法主要区别就是一个栈 队 的不同,LILO 和LIFO
class Solution {
int[] dx = new int[]{1, 0, 0, -1};
int[] dy = new int[]{0, 1, -1, 0};
public int maxAreaOfIsland(int[][] grid) {
int ans = 0, cur = 1;
int m = grid.length, n = grid[0].length;
Queue<int[]> que = new LinkedList<>();
for (int i = 0; i < m; i ++) {
for (int j = 0; j < n; j ++) {
ans = Math.max(ans, dfs(grid, i, j));
}
}
return ans;
}
// 递归函数,由函数隐含的维护了一个栈
private int dfs(int[][] grid, int i, int j) {
int ans = 0;
if (i >= grid.length || i < 0 || j >= grid[0].length || j < 0 || grid[i][j] == 0) {
return 0;
}
ans ++;
grid[i][j] = 0;
for (int k = 0; k < 4; k ++) {
ans += dfs(grid, i + dx[k], j + dy[k]);
}
return ans;
}
}
这里由于函数递归,隐含维护了一个栈,所以它所用的内存空间要大一些,时间复杂度是一样的。
在第二道题里面有一个细节就是 队里面的元素需要操作 这样每一层要有具体的操作
class Solution {
public Node connect(Node root) {
Queue<Node> que = new LinkedList<>();
if (root == null) return root;
que.offer(root);
while (!que.isEmpty()) {
int size = que.size();
for (int i = 0; i < size; i ++) {
// 取出节点
Node node = que.poll();
// 连接节点
if (i < size - 1) {
node.next = que.peek();
}
// 填充节点到队列
if (node.left != null) {
que.offer(node.left);
}
if (node.right != null) {
que.offer(node.right);
}
}
}
return root;
}
}
原文地址:https://www.cnblogs.com/TCD-record/p/15186509.html
- ASP.NET MVC5+EF6+EasyUI 后台管理系统(2)-easyui构建前端页面框架[附源码]
- 扬言毁灭人类的索菲亚再一次挑战了人类
- SQL Server 存储过程生成insert语句
- silverlight 背景透明
- .Net 转战 Android 4.4 日常笔记(1)--工具及环境搭建
- ASP.NET MVC5+EF6+EasyUI 后台管理系统(33)-MVC 表单验证
- 如何利用深度学习识别千万张图片?
- ASP.NET MVC5+EF6+EasyUI 后台管理系统(32)-swfupload多文件上传[附源码]
- ASP.NET MVC5+EF6+EasyUI 后台管理系统(31)-MVC使用RDL报表
- 43 Hot Flex and ActionScript 3.0 APIs, tips and tools for Autumn 2008
- 异步数据存储
- 谈谈基于SQL Server 的Exception Handling[中篇]
- C# AD(Active Directory)域信息同步,组织单位、用户等信息查询
- 如何仅使用TensorFlow C+来训练深度神经网络
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- redis妙用-string类型
- redis妙用-hash类型
- redis妙用-list类型
- redis妙用-set类型
- JVM调优实战:解决CMS concurrent-abortable-preclean LongGC的问题
- redis妙用-zset类型
- 【线上排查实战】AOP切面执行顺序你真的了解吗
- 使用markdown,knitr和pandoc在R语言中编写可重现的报告
- R语言广义线性模型(GLMs)算法和零膨胀模型分析
- R语言中广义线性模型(GLM)中的分布和连接函数分析
- R语言自适应平滑样条回归分析
- R语言区间数据回归分析
- R语言ggsurvplot绘制生存曲线报错 : object of type ‘symbol‘ is not subsettable
- R软件SIR模型网络结构扩散过程模拟
- R语言中使用线性模型、回归决策树自动组合特征因子水平