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

相关文章

Spring boot整合dubbo+zookeeper的详细过程

《Springboot整合dubbo+zookeeper的详细过程》本文讲解SpringBoot整合Dubbo与Zookeeper实现API、Provider、Consumer模式,包含依赖配置、... 目录Spring boot整合dubbo+zookeeper1.创建父工程2.父工程引入依赖3.创建ap

使用Python删除Excel中的行列和单元格示例详解

《使用Python删除Excel中的行列和单元格示例详解》在处理Excel数据时,删除不需要的行、列或单元格是一项常见且必要的操作,本文将使用Python脚本实现对Excel表格的高效自动化处理,感兴... 目录开发环境准备使用 python 删除 Excphpel 表格中的行删除特定行删除空白行删除含指定

SpringBoot结合Docker进行容器化处理指南

《SpringBoot结合Docker进行容器化处理指南》在当今快速发展的软件工程领域,SpringBoot和Docker已经成为现代Java开发者的必备工具,本文将深入讲解如何将一个SpringBo... 目录前言一、为什么选择 Spring Bootjavascript + docker1. 快速部署与

MySQL中的LENGTH()函数用法详解与实例分析

《MySQL中的LENGTH()函数用法详解与实例分析》MySQLLENGTH()函数用于计算字符串的字节长度,区别于CHAR_LENGTH()的字符长度,适用于多字节字符集(如UTF-8)的数据验证... 目录1. LENGTH()函数的基本语法2. LENGTH()函数的返回值2.1 示例1:计算字符串

Spring Boot spring-boot-maven-plugin 参数配置详解(最新推荐)

《SpringBootspring-boot-maven-plugin参数配置详解(最新推荐)》文章介绍了SpringBootMaven插件的5个核心目标(repackage、run、start... 目录一 spring-boot-maven-plugin 插件的5个Goals二 应用场景1 重新打包应用

SpringBoot+EasyExcel实现自定义复杂样式导入导出

《SpringBoot+EasyExcel实现自定义复杂样式导入导出》这篇文章主要为大家详细介绍了SpringBoot如何结果EasyExcel实现自定义复杂样式导入导出功能,文中的示例代码讲解详细,... 目录安装处理自定义导出复杂场景1、列不固定,动态列2、动态下拉3、自定义锁定行/列,添加密码4、合并

mybatis执行insert返回id实现详解

《mybatis执行insert返回id实现详解》MyBatis插入操作默认返回受影响行数,需通过useGeneratedKeys+keyProperty或selectKey获取主键ID,确保主键为自... 目录 两种方式获取自增 ID:1. ​​useGeneratedKeys+keyProperty(推

Spring Boot集成Druid实现数据源管理与监控的详细步骤

《SpringBoot集成Druid实现数据源管理与监控的详细步骤》本文介绍如何在SpringBoot项目中集成Druid数据库连接池,包括环境搭建、Maven依赖配置、SpringBoot配置文件... 目录1. 引言1.1 环境准备1.2 Druid介绍2. 配置Druid连接池3. 查看Druid监控

Python通用唯一标识符模块uuid使用案例详解

《Python通用唯一标识符模块uuid使用案例详解》Pythonuuid模块用于生成128位全局唯一标识符,支持UUID1-5版本,适用于分布式系统、数据库主键等场景,需注意隐私、碰撞概率及存储优... 目录简介核心功能1. UUID版本2. UUID属性3. 命名空间使用场景1. 生成唯一标识符2. 数

Java中读取YAML文件配置信息常见问题及解决方法

《Java中读取YAML文件配置信息常见问题及解决方法》:本文主要介绍Java中读取YAML文件配置信息常见问题及解决方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要... 目录1 使用Spring Boot的@ConfigurationProperties2. 使用@Valu