LeetCode刷题:695. Max Area of Island(JAVA代码详解)

2023-11-10 14:38

本文主要是介绍LeetCode刷题:695. Max Area of Island(JAVA代码详解),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

LeetCode刷题:695. Max Area of Island

原题链接:https://leetcode.com/problems/max-area-of-island/description/

Given a non-empty 2D array grid of 0’s and 1’s, an island is a group of 1’s (representing land) connected 4-directionally (horizontal or vertical.) You may assume all four edges of the grid are surrounded by water.

Find the maximum area of an island in the given 2D array. (If there is no island, the maximum area is 0.)

Example 1:
[[0,0,1,0,0,0,0,1,0,0,0,0,0],
[0,0,0,0,0,0,0,1,1,1,0,0,0],
[0,1,1,0,1,0,0,0,0,0,0,0,0],
[0,1,0,0,1,1,0,0,1,0,1,0,0],
[0,1,0,0,1,1,0,0,1,1,1,0,0],
[0,0,0,0,0,0,0,0,0,0,1,0,0],
[0,0,0,0,0,0,0,1,1,1,0,0,0],
[0,0,0,0,0,0,0,1,1,0,0,0,0]]

Given the above grid, return 6. Note the answer is not 11, because the island must be connected 4-directionally.

Example 2:
[[0,0,0,0,0,0,0,0]]

Given the above grid, return 0.
Note: The length of each dimension in the given grid does not exceed 50.

这个题目的意思是给定了一个非空的二维数组,单元格的值由0和1构成。1代表岛(陆地),0代表水。岛是由上下左右相邻的陆地构成。
假设二维数组的四周边界之外都是水。
在给定的二维数组中找到岛(陆地)的最大面积。如果给定的二维数组中没有岛,则岛的最大面积为0。

问题分析

这个题目可以考虑从二维数组的左上角位置,其坐标为[0,0]开始进行遍历,采用DFS搜索算法,找出某一个位置,其上下左右相邻的位置均为1的最大数,即为岛的面积。

对于二维数组中某一个元素的位置 [i,j] 来说,搜索的方向有4个,分别确定其坐标进行搜索:

[ i + 1 , j ] , [ i , j + 1 ] , [ i − 1 , j ] , [ i , j − 1 ] [i+1,j],[i,j+1],[i-1,j],[i,j-1] [i+1,j],[i,j+1],[i1,j],[i,j1]

算法实现

编写一个方法maxAreaOfIsland()来求岛的最大面积,返回值即为所求的最大面积。

public int maxAreaOfIsland(int[][] grid) {int max = 0//......return max;
}

编写一个双重循环,从给定的二维数组的左上角,即[0,0]位置开始搜索,当满足条件 grid[i][j] == 1 时,调用DFS算法向其周围的四个方向进行搜索。代码如下:

public int maxAreaOfIsland(int[][] grid) {//如果grid为空或者grid的长度为0,则返回。结束。if (grid == null || grid.length == 0) {return 0;}//获得M*N矩阵的维度int m = grid.length;int n = grid[0].length;//设置max初始值为0int max = 0;//双重循环for (int i = 0; i < m; i++) {for (int j = 0; j < n; j++) {//如果grid[i][j]的值为1,则进行搜索if (grid[i][j] == 1) {int area = dfs(grid, i, j, m, n, 0);//取最大值max = Math.max(area, max);}}}//返回最大值return max;}

DFS算法如何设计呢?

/** DFS搜索算法思路* 输入参数:* grid—矩阵* i,j 表示矩阵元素的坐标* m,n 表示矩阵的行和列* area表示最大面积* */int dfs(int[][] grid, int i, int j, int m, int n, int area) {if (i < 0 || i >= m || j < 0 || j >= n || grid[i][j] == 0) {return area;}//标记为0,搜索过的单元格位置标记为0grid[i][j] = 0;//area加1area++;//继续向4个方向搜索area = dfs(grid, i + 1, j, m, n, area);area = dfs(grid, i, j + 1, m, n, area);area = dfs(grid, i - 1, j, m, n, area);area = dfs(grid, i, j - 1, m, n, area);//返回areareturn area;}
完整的算法实现
package com.bean.algorithmbasic;public class MaxAreaofIsland {public int maxAreaOfIsland(int[][] grid) {//如果grid为空或者grid的长度为0,则返回。结束。if (grid == null || grid.length == 0) {return 0;}//获得M*N矩阵的维度int m = grid.length;int n = grid[0].length;//设置max初始值为0int max = 0;//双重循环for (int i = 0; i < m; i++) {for (int j = 0; j < n; j++) {//如果grid[i][j]的值为1,则进行搜索if (grid[i][j] == 1) {int area = dfs(grid, i, j, m, n, 0);//取最大值max = Math.max(area, max);}}}//返回最大值return max;}int dfs(int[][] grid, int i, int j, int m, int n, int area) {if (i < 0 || i >= m || j < 0 || j >= n || grid[i][j] == 0) {return area;}//标记为0grid[i][j] = 0;//area加1area++;//继续向4个方向搜索area = dfs(grid, i + 1, j, m, n, area);area = dfs(grid, i, j + 1, m, n, area);area = dfs(grid, i - 1, j, m, n, area);area = dfs(grid, i, j - 1, m, n, area);//返回areareturn area;}public static void main(String args[]) {int[][] map= {		{0,0,1,0,0,0,0,1,0,0,0,0,0},{0,0,0,0,0,0,0,1,1,1,0,0,0},{0,1,1,0,1,0,0,0,0,0,0,0,0},{0,1,0,0,1,1,0,0,1,0,1,0,0},{0,1,0,0,1,1,0,0,1,1,1,0,0},{0,0,0,0,0,0,0,0,0,0,1,0,0},{0,0,0,0,0,0,0,1,1,1,0,0,0},{0,0,0,0,0,0,0,1,1,0,0,0,0}};MaxAreaofIsland maos=new MaxAreaofIsland();int ANSWER=maos.maxAreaOfIsland(map);System.out.println("ANSWER = "+ANSWER);}
}

运行结果:

ANSWER = 6

(完)

这篇关于LeetCode刷题:695. Max Area of Island(JAVA代码详解)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/383304

相关文章

C++使用栈实现括号匹配的代码详解

《C++使用栈实现括号匹配的代码详解》在编程中,括号匹配是一个常见问题,尤其是在处理数学表达式、编译器解析等任务时,栈是一种非常适合处理此类问题的数据结构,能够精确地管理括号的匹配问题,本文将通过C+... 目录引言问题描述代码讲解代码解析栈的状态表示测试总结引言在编程中,括号匹配是一个常见问题,尤其是在

Java实现检查多个时间段是否有重合

《Java实现检查多个时间段是否有重合》这篇文章主要为大家详细介绍了如何使用Java实现检查多个时间段是否有重合,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录流程概述步骤详解China编程步骤1:定义时间段类步骤2:添加时间段步骤3:检查时间段是否有重合步骤4:输出结果示例代码结语作

Java中String字符串使用避坑指南

《Java中String字符串使用避坑指南》Java中的String字符串是我们日常编程中用得最多的类之一,看似简单的String使用,却隐藏着不少“坑”,如果不注意,可能会导致性能问题、意外的错误容... 目录8个避坑点如下:1. 字符串的不可变性:每次修改都创建新对象2. 使用 == 比较字符串,陷阱满

Java判断多个时间段是否重合的方法小结

《Java判断多个时间段是否重合的方法小结》这篇文章主要为大家详细介绍了Java中判断多个时间段是否重合的方法,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录判断多个时间段是否有间隔判断时间段集合是否与某时间段重合判断多个时间段是否有间隔实体类内容public class D

IDEA编译报错“java: 常量字符串过长”的原因及解决方法

《IDEA编译报错“java:常量字符串过长”的原因及解决方法》今天在开发过程中,由于尝试将一个文件的Base64字符串设置为常量,结果导致IDEA编译的时候出现了如下报错java:常量字符串过长,... 目录一、问题描述二、问题原因2.1 理论角度2.2 源码角度三、解决方案解决方案①:StringBui

Java覆盖第三方jar包中的某一个类的实现方法

《Java覆盖第三方jar包中的某一个类的实现方法》在我们日常的开发中,经常需要使用第三方的jar包,有时候我们会发现第三方的jar包中的某一个类有问题,或者我们需要定制化修改其中的逻辑,那么应该如何... 目录一、需求描述二、示例描述三、操作步骤四、验证结果五、实现原理一、需求描述需求描述如下:需要在

Debezium 与 Apache Kafka 的集成方式步骤详解

《Debezium与ApacheKafka的集成方式步骤详解》本文详细介绍了如何将Debezium与ApacheKafka集成,包括集成概述、步骤、注意事项等,通过KafkaConnect,D... 目录一、集成概述二、集成步骤1. 准备 Kafka 环境2. 配置 Kafka Connect3. 安装 D

Java中ArrayList和LinkedList有什么区别举例详解

《Java中ArrayList和LinkedList有什么区别举例详解》:本文主要介绍Java中ArrayList和LinkedList区别的相关资料,包括数据结构特性、核心操作性能、内存与GC影... 目录一、底层数据结构二、核心操作性能对比三、内存与 GC 影响四、扩容机制五、线程安全与并发方案六、工程

JavaScript中的reduce方法执行过程、使用场景及进阶用法

《JavaScript中的reduce方法执行过程、使用场景及进阶用法》:本文主要介绍JavaScript中的reduce方法执行过程、使用场景及进阶用法的相关资料,reduce是JavaScri... 目录1. 什么是reduce2. reduce语法2.1 语法2.2 参数说明3. reduce执行过程

如何使用Java实现请求deepseek

《如何使用Java实现请求deepseek》这篇文章主要为大家详细介绍了如何使用Java实现请求deepseek功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1.deepseek的api创建2.Java实现请求deepseek2.1 pom文件2.2 json转化文件2.2