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

LeetCode 463. 岛屿的周长 java题解

https://leetcode.cn/problems/island-perimeter/

方法一

class Solution {public int islandPerimeter(int[][] grid) {int[][] dir={{0,-1},{0,1},{1,0},{-1,0}};//四个方向int m=grid.length;int n=grid[0].length;int res=0;//周长for(int i=0;i<m;i++){for(int j=0;j<n;j++){if(grid[i][j]==1){for(int k=0;k<4;k++){int x=i+dir[k][0];int y=j+dir[k][1];if(x<0||y<0||x>=m||y>=n||grid[x][y]==0){//出去就不是陆地了res++;}}}}}return res;}
}

他人答案

// 解法一
class Solution {// 上下左右 4 个方向int[] dirx = {-1, 1, 0, 0};int[] diry = {0, 0, -1, 1};public int islandPerimeter(int[][] grid) {int m = grid.length;int n = grid[0].length;int res = 0; // 岛屿周长for (int i = 0; i < m; i++) {for (int j = 0; j < n; j++) {if (grid[i][j] == 1) {for (int k = 0; k < 4; k++) {int x = i + dirx[k];int y = j + diry[k];// 当前位置是陆地,并且从当前位置4个方向扩展的“新位置”是“水域”或“新位置“越界,则会为周长贡献一条边if (x < 0 || x >= m || y < 0 || y >= n || grid[x][y] == 0) {res++;continue;}}}}}return res;}
}// 解法二
class Solution {public int islandPerimeter(int[][] grid) {// 计算岛屿的周长 // 方法二 : 遇到相邻的陆地总周长就-2int landSum = 0; // 陆地数量 int cover = 0; // 相邻陆地数量for (int i = 0; i < grid.length; i++) {for (int j = 0; j < grid[0].length; j++) {if (grid[i][j] == 1) {landSum++;// 统计上面和左边的相邻陆地if(i - 1 >= 0 && grid[i-1][j] == 1) cover++;if(j - 1 >= 0 && grid[i][j-1] == 1) cover++;// 为什么没统计下边和右边? 因为避免重复计算}}}return landSum * 4 - cover * 2;}
}
// 延伸 - 傳統DFS解法(使用visited數組)(遇到邊界 或是 海水 就edge ++)
class Solution {int dir[][] ={{0, 1},{0, -1},{1, 0},{-1, 0}};boolean visited[][];int res = 0;public int islandPerimeter(int[][] grid) {int row = grid.length;int col = grid[0].length;visited = new boolean[row][col];int result = 0;for(int i = 0; i < row; i++){for(int j = 0; j < col; j++){if(visited[i][j] == false && grid[i][j] == 1)result += dfs(grid, i, j);}}return result;}private int dfs(int[][] grid, int x, int y){//如果遇到 邊界(x < 0 || y < 0 || x >= grid.length || y >= grid[0].length)或是 遇到海水(grid[x][y] == 0)就return 1(edge + 1)if(x < 0 || y < 0 || x >= grid.length || y >= grid[0].length || grid[x][y] == 0)return 1;//如果該地已經拜訪過,就return 0 避免重複計算if(visited[x][y])return 0;int temp = 0;visited[x][y] = true;for(int i = 0; i < 4; i++){int nextX = x + dir[i][0];int nextY = y + dir[i][1];//用temp 把edge存起來temp +=dfs(grid, nextX, nextY);}return temp;}
}
http://www.xdnf.cn/news/698869.html

相关文章:

  • 软件测试之黑盒测试与白盒测试详解
  • python 小工具,获取 github 仓库信息
  • ORDER BY子句在一个 SQL 查询中只能出现一次
  • 全球轨道铺设设备市场发展现状与未来趋势分析
  • HDFS:解锁大数据存储的奥秘
  • 54、C# 委托 (Delegate)
  • Maven 项目中集成数据库文档生成工具
  • leetcode hot100刷题日记——23.数组中的第K个最大元素
  • 磁光电流互感器行业2025数据分析报告
  • UE5 编辑器工具蓝图
  • 2025年AEJ SCI2区,动态反向排序教与学优化算法DSTLBO+光伏系统参数辨识,深度解析+性能实测
  • java课堂笔记10
  • ubuntu创建指定版本python虚拟环境
  • emu8086 v4.08安装教程
  • Python基础语法(下)
  • 打破认知壁垒重构科技驱动美好生活 大模型义务传播计划
  • 数据科学入门
  • CS144 - Lecture 1 记录
  • js中common.js和ECMAScript.js区别
  • 智慧交通新纪元:AI赋能下的交通治理革命与技术演进路径
  • 学习路之Nginx--不同域名的反向代理
  • 有道翻译js分析
  • 对于Const关键字修饰的对象
  • 明远智睿SSD2351开发板:语音机器人领域的变革力量
  • 麻省理工新突破:家庭场景下机器人实现精准控制,real-to-sim-to-real学习助力
  • Conda更换镜像源教程:加速Python包下载
  • C++基础:模拟实现vector(有存在深层次的浅拷贝问题)
  • 【芯片设计- SoC 常用模块 9.1 -- PLL 介绍】
  • 本周白银想法
  • 《数据结构笔记六》队列 ⭐⭐⭐