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项目部署命令java -jar的各种参数及作用详解

《SpringBoot项目部署命令java-jar的各种参数及作用详解》:本文主要介绍SpringBoot项目部署命令java-jar的各种参数及作用的相关资料,包括设置内存大小、垃圾回收... 目录前言一、基础命令结构二、常见的 Java 命令参数1. 设置内存大小2. 配置垃圾回收器3. 配置线程栈大小

SpringBoot实现微信小程序支付功能

《SpringBoot实现微信小程序支付功能》小程序支付功能已成为众多应用的核心需求之一,本文主要介绍了SpringBoot实现微信小程序支付功能,文中通过示例代码介绍的非常详细,对大家的学习或者工作... 目录一、引言二、准备工作(一)微信支付商户平台配置(二)Spring Boot项目搭建(三)配置文件

解决SpringBoot启动报错:Failed to load property source from location 'classpath:/application.yml'

《解决SpringBoot启动报错:Failedtoloadpropertysourcefromlocationclasspath:/application.yml问题》这篇文章主要介绍... 目录在启动SpringBoot项目时报如下错误原因可能是1.yml中语法错误2.yml文件格式是GBK总结在启动S

鸿蒙中@State的原理使用详解(HarmonyOS 5)

《鸿蒙中@State的原理使用详解(HarmonyOS5)》@State是HarmonyOSArkTS框架中用于管理组件状态的核心装饰器,其核心作用是实现数据驱动UI的响应式编程模式,本文给大家介绍... 目录一、@State在鸿蒙中是做什么的?二、@Spythontate的基本原理1. 依赖关系的收集2.

Spring中配置ContextLoaderListener方式

《Spring中配置ContextLoaderListener方式》:本文主要介绍Spring中配置ContextLoaderListener方式,具有很好的参考价值,希望对大家有所帮助,如有错误... 目录Spring中配置ContextLoaderLishttp://www.chinasem.cntene

jupyter代码块没有运行图标的解决方案

《jupyter代码块没有运行图标的解决方案》:本文主要介绍jupyter代码块没有运行图标的解决方案,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录jupyter代码块没有运行图标的解决1.找到Jupyter notebook的系统配置文件2.这时候一般会搜索到

java实现延迟/超时/定时问题

《java实现延迟/超时/定时问题》:本文主要介绍java实现延迟/超时/定时问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Java实现延迟/超时/定时java 每间隔5秒执行一次,一共执行5次然后结束scheduleAtFixedRate 和 schedu

Java Optional避免空指针异常的实现

《JavaOptional避免空指针异常的实现》空指针异常一直是困扰开发者的常见问题之一,本文主要介绍了JavaOptional避免空指针异常的实现,帮助开发者编写更健壮、可读性更高的代码,减少因... 目录一、Optional 概述二、Optional 的创建三、Optional 的常用方法四、Optio

Spring Boot项目中结合MyBatis实现MySQL的自动主从切换功能

《SpringBoot项目中结合MyBatis实现MySQL的自动主从切换功能》:本文主要介绍SpringBoot项目中结合MyBatis实现MySQL的自动主从切换功能,本文分步骤给大家介绍的... 目录原理解析1. mysql主从复制(Master-Slave Replication)2. 读写分离3.

Redis实现延迟任务的三种方法详解

《Redis实现延迟任务的三种方法详解》延迟任务(DelayedTask)是指在未来的某个时间点,执行相应的任务,本文为大家整理了三种常见的实现方法,感兴趣的小伙伴可以参考一下... 目录1.前言2.Redis如何实现延迟任务3.代码实现3.1. 过期键通知事件实现3.2. 使用ZSet实现延迟任务3.3