LeetCode刷题 463. Island Perimeter 岛屿的周长 Java

LeetCode刷题 463. Island Perimeter 岛屿的周长 Java

题目介绍

链接:https://leetcode-cn.com/problems/island-perimeter

给定一个包含 0 和 1 的二维网格地图,其中 1 表示陆地 0 表示水域。

网格中的格子水平和垂直方向相连(对角线方向不相连)。整个网格被水完全包围,但其中恰好有一个岛屿(或者说,一个或多个表示陆地的格子相连组成的岛屿)。

岛屿中没有“湖”(“湖” 指水域在岛屿内部且不和岛屿周围的水相连)。格子是边长为 1 的正方形。网格为长方形,且宽度和高度均不超过 100 。计算这个岛屿的周长。

示例图片如下:

二维数组代替一个地图区域,0表示水域1表示小岛,所有水域都是联通集。

题目的要求主要就是实现对二维数组中上下左右相邻元素数值的判断,因为一旦相邻就会造成两者结合部分的消失。

解法一

从图中看到所有的小岛,或者说所有的相邻元素之间存在的状态只可能是四种情况。

单独的一个单位为1的小岛,那么他会贡献小岛总的长度为4的四个边长

当前小岛只有一个边会与另外一个小岛相接,那么当前的小岛会贡献其余的三个边作为总的边长

当前小岛有两个方向与其他小岛相接,会贡献其余的两边给整个小岛的周长

当前小岛有三个方向与其他小岛相接,剩余的一条边会作为整个小岛的周长

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-T5XtSeeh-1604059924354)(三边相连.png)]

当前小岛所有相邻方向全与别的小岛相接,成为一个内陆部分不贡献自己的任何边

因此只要遍历数组中**所有种类小岛的个数**,根据各种类会贡献的周长就可以算出小岛周长总和。

class Solution {

public int islandPerimeter(int[][] grid) {

int n = grid.length;

int m = grid[0].length;

int ans=0;

int [] dx={0,1,0,-1};//位移数组

int [] dy={1,0,-1,0};//分别访问当前元素下,右,上,左位置

for(int i=0;i

for(int j=0;j

if(grid[i][j]==0){

continue;//不是小岛元素直接continue

}//底下是小岛单位

int count=0//count记录当前小岛上下左右四个位置是否有相邻

for(int k=0;k

int nx = i+dx[k];

int ny = j+dy[k];

if(nx>=0&&nx=0&&ny

count++;

}

switch(count){//当前单位小岛相邻位置判断结束,根据count计算最终结果

case 0 :ans+=4;break;

case 1 :ans+=3;break;

case 2 :ans+=2;break;

case 3 :ans+=1;break;

case 4 :ans=ans;break;

}

}

}

return ans;

}

}

解法二

解法一存在的问题

思考上一种的解法可以发现,每次遍历的时候是会出现**重复判断**的。也就是在上一行当中已经判断过元素a与下一行的元素b相接,但是到下一行元素b时又会判断是否与上一行的元素a相接。

解决办法

从第一个元素开始判断是否是岛屿元素,是则直接默认贡献四边的长度count+=4,然后再向右和向下判断是否和其他元素相邻,若相邻一条边则消失两条边的周长count-=2(两条边重合并且都不再是岛屿的边缘)。等于遍历到底部元素时不会在继续判断上方已经判断过的元素。

class Solution {

public int islandPerimeter(int[][] grid) {

int n = grid.length;

int m = grid[0].length;

int count=0;//记录总的小岛边数

int [] dx={0,1};//位移数组,向右享下

int [] dy={1,0};

for(int i=0;i

for(int j=0;j

if(grid[i][j]==0){

continue;//不是小岛元素直接continue

}

count+=4;//时元素默认直接时单独的,再继续向右向下判断

for(int k=0;k

int nx = i+dx[k];

int ny = j+dy[k];

if(nx

count-=2;//相邻一条边,减去最终的两条边

}

}

}

return count;

}

}

一点思考

因为题目当前限定的是一个相连再一起的岛屿,不会存在类似与两个单独空心湖泊存在的情况。那么就一定确保了岛屿在四个面方向上**对立面的个数总是相同的**。比如说岛屿的左面有三个面就一定确保了右面也只有三个面,能否只通过检测两个对立面中的其中一个方向获取总的岛屿周长呢?大家一起交流讨论把。

LeetCode刷题 463. Island Perimeter 岛屿的周长 Java相关教程

LeetCode BST专题 538 把二叉搜索树转换成累加树 java

LeetCode BST专题 538 把二叉搜索树转换成累加树 java 给出二叉 搜索 树的根节点,该树的节点值各不相同,请你将其转换为累加树(Greater Sum Tree),使每个节点 node 的新值等于原树中大于或等于 node.val 的值之和。 本题是BST,关于BST我们要明确一点,中

【力扣每日一题/30】463. 岛屿的周长

【力扣每日一题/30】463. 岛屿的周长 感谢茫茫人海中我们能够相遇,特别是这么优秀可爱的你还能来关注我,真的很感恩 俗话说:当你的才华和能力,不足以支撑你的梦想的时候,请静下心来学习。 希望优秀的你可以和我一起学习,一起努力,实现属于自己的梦想。

LeetCode-岛屿的周长

LeetCode-岛屿的周长 题目要求 原题链接 :463. 岛屿的周长 给定一个包含 0 和 1 的二维网格地图,其中 1 表示陆地 0 表示水域。 网格中的格子水平和垂直方向相连(对角线方向不相连)。整个网格被水完全包围,但其中恰好有一个岛屿(或者说,一个或多个表示

LeetCode 376 摇摆序列

LeetCode 376 摇摆序列 分析 这道题是是个贪心的题目,如果把数组中的点在二位坐标中画出来,是一个折线,只需要计算拐点的次数就可以了, 需要注意的是代码利用了自动机的思想,比只写if else的代码可读性强 如果在面试中写出这样的代码,能体现出扎实的基本

leetcode刷题.530. 二叉搜索树的最小绝对差.每日打卡

leetcode刷题.530. 二叉搜索树的最小绝对差.每日打卡 class Solution {public: int threeMin(int a, int b, int c) { return (a b) ? ((b c) ? c : b) : ((a c) ? c : a); } int maxTreeNode(TreeNode *root) { while(nullptr != root-right) root = root-rig

Leetcode 463. 岛屿的周长 (四个方向遍历找规律)

Leetcode 463. 岛屿的周长 (四个方向遍历找规律) 我们发现,岛屿的边的个数可以如下计算,如果从这一方格出发,遍历上下左右,如果周围出界了或者是水,那么这个周围就是一条边。因为题目保证了只有一个岛屿,所以可以不用DFS,直接对整个方格进行遍历就能解

LeetCode - 589.N叉树的前序遍历、后序遍历、层序遍历(递归、迭

LeetCode - 589.N叉树的前序遍历、后序遍历、层序遍历(递归、迭代) 589.N叉树的前序遍历 例如,给定一个 3叉树 : 题目: 给定一个 N 叉树,返回其节点值的前序遍历。 返回其前序遍历: [1,3,5,6,2,4]。 方法一 :递归 class Solution { public ListInteger p

leetcode463:岛屿的周长

leetcode463:岛屿的周长 给定一个包含 0 和 1 的二维网格地图,其中 1 表示陆地, 0 表示水域。 网格中的格子水平和垂直方向相连(对角线方向不相连)。整个网格被水完全包围,但其中恰好有一个岛屿(或者说,一个或多个表示陆地的格子相连组成的岛屿)。 岛

岛屿数量JAVA_LeetCode刷题 463. Island Perimeter 岛屿的周长 Java相关推荐

  1. 463. Island Perimeter 岛屿的周长

    给定一个包含 0 和 1 的二维网格地图,其中 1 表示陆地 0 表示水域. 网格中的格子水平和垂直方向相连(对角线方向不相连).整个网格被水完全包围,但其中恰好有一个岛屿(或者说,一个或多个表示陆地 ...

  2. Leetcode刷题 463题:岛屿的周长(基于Java语言)

    ** Leetcode刷题 463题:岛屿的周长(基于Java语言) ** 一. 题目描述: 给定一个包含 0 和 1 的二维网格地图,其中 1 表示陆地 0 表示水域. 网格中的格子水平和垂直方向相 ...

  3. D38 463. Island Perimeter

    463. Island Perimeter 题目链接 463. Island Perimeter 题目分析 给定一个二维数组,代表一个二维表格. 里面包含0和1两种数字. 1代表有内容,0代表没有. ...

  4. Leetcode PHP题解--D38 463. Island Perimeter

    2019独角兽企业重金招聘Python工程师标准>>> 463. Island Perimeter 题目链接 463. Island Perimeter 题目分析 给定一个二维数组, ...

  5. Leetcode 200 岛屿数量 (每日一题 20210720)

    给你一个由 '1'(陆地)和 '0'(水)组成的的二维网格,请你计算网格中岛屿的数量.岛屿总是被水包围,并且每座岛屿只能由水平方向和/或竖直方向上相邻的陆地连接形成.此外,你可以假设该网格的四条边均被 ...

  6. 【算法思路】常见岛屿数量的算法题

    岛屿的最大面积 思路:dfs 两层遍历,遇到岛屿时,则进入深度优先遍历,也就是递归 岛屿深度优先遍历 判断是否越界,或者是不是岛屿,如果越界或者不是岛屿则返回 将该岛屿置为海洋,并将面积加一 从该岛屿 ...

  7. 【大厂高频真题100题】《岛屿数量》 真题练习第12题 持续更新~

    岛屿数量 描述 给你一个由 '1'(陆地)和 '0'(水)组成的的二维网格,请你计算网格中岛屿的数量. 岛屿总是被水包围,并且每座岛屿只能由水平方向和/或竖直方向上相邻的陆地连接形成. 此外,你可以假 ...

  8. LeetCode刷题(十)----数组-----medium部分(Java、C++)

    LeetCode刷题(十)-----数组-------medium部分(Java.C++) 238. 除自身以外数组的乘积 给定长度为n的整数数组nums,其中n>1,返回输出数组output, ...

  9. 岛屿最大面积 leetcode Java_LeetCode刷题记录——岛屿的最大面积

    题目描述: 给定一个包含了一些 0 和 1的非空二维数组 grid , 一个 岛屿 是由四个方向 (水平或垂直) 的 1 (代表土地) 构成的组合.你可以假设二维矩阵的四个边缘都被水包围着. 找到给定 ...

最新文章

  1. Git 常用操作(4)- 更改提交
  2. 为什么「道理都懂,然而执行力差」的现象如此普遍?
  3. Android下拉刷新开源库对比(转)
  4. windows2003 DHCP中批处理绑定IP与MAC
  5. spark 在启动的时候出现JAVA_HOME not set
  6. C#调用webservice(二)
  7. python 模拟浏览器selenium_使用Selenium模拟浏览器,实现自动爬取数据
  8. python基础教程慕课_Python基础教程(6)--抽象
  9. 华为服务器修改SN,华为光猫修改双模、SN序号、MAC地址方法
  10. 银行排队问题(详解队列)
  11. android图标分组名称唯美简单可复制,分组名称唯美简短的
  12. GitHub双重认证问题
  13. 印象智能手写板体验:低成本手写方案
  14. 2022.11.11 CodeForces1324D Pair of Topics
  15. 【翻译】Xv6 book Chapter 8:File system
  16. Nginx中文域名配置
  17. 芯片设计概念:乒乓操作,串并转换,流水线操作
  18. 伺服电机脉冲控制方式
  19. 上肢康复训练器材是什么
  20. 技术至简-7:2G/3G/4G/5G基站系统中混合调制的技术框架

热门文章

  1. 统计英文字数c语言,c语言题目,纯英文字数统计,怎么错了?
  2. 小说光看还不够?当然得有美女一样的声音来阅读!
  3. Android 使用FFmpeg 裁剪出正方形视频
  4. 计算机网络总结600字,电脑的自述600字
  5. 控制windows开关机代码
  6. 上海睿昂生物获得数亿元战略融资,浙江大健康产业基金领投
  7. applicationContext.xml读取properties中属性
  8. 关于 ‘builtin_function_or_method‘ object has no attribute ‘set_colorkey‘和 No video mode has been set解释
  9. java技术栈 高清视频
  10. 一个程序员悲催的网络爱情