leetcode求岛屿周长

原题链接

1. 题目描述

给定一个包含 0 和 1 的二维网格地图,其中 1 表示陆地 0 表示水域
网格中的格子水平和垂直方向相连(对角线方向不相连)。整个网格被水完全包围,但其中恰好有一个岛屿(或者说,一个或多个表示陆地的格子相连组成的岛屿)。
岛屿中没有“湖”(“湖” 指水域在岛屿内部且不和岛屿周围的水相连)。格子是边长为 1 的正方形。网格为长方形,且宽度和高度均不超过 100 。计算这个岛屿的周长。
图片说明

  • 类似这种矩阵,由1连接而成的岛屿,黄色边代表整体的边长。我们需要求整体周长。

    2. 分析求解

  • 很好想到的是简单方法就是遍历二维矩阵,遇到1的区域,看看上下左右是否有0相邻。如果有,则边长加1,或者到边界了边长也加1.重要的是建立遍历顺序不重不漏遍历所有区域。并把满足条件的边加到结果集中。

    3. 代码

    class Solution {
    public:
      int islandPerimeter(vector<vector<int>>& grid) {
          int m = grid.size(),n= grid[0].size(); // 取行列
          if(m==0||n==0) return 0;
          int dx[4] = {-1,0,1,0},dy[4] = {0,1,0,-1}; // 定义每个方向上的步长
          int result = 0;
    
          for(int i=0;i < m;i++)
              for(int j = 0;j < n;j++){ //双重循环取二维矩阵元素
                  if(grid[i][j]){ // 初始值如果不为0 我们看周围
                  int count=0; 
                  for(int k = 0;k < 4;k++){ //遍历四个方向 
                      int x = i + dx[k];
                      int y = j + dy[k];
                      if(x < 0||x >= m||y < 0||y >= n||!grid[x][y]){ 
                          count+=1;
                      }
                  }
                  result+=count;
                  } 
              }
          return result;    
      }
    };
全部评论

相关推荐

小厂面经,也是我的处女面(30min)1.自我介绍2.spring&nbsp;boot的自动装配原理(好多类和接口的单词都忘了全称是啥了,就说了记得的单词,流程应该说对了吧)3.有用过redis吗?主要是用在实现什么功能(说了技术派用redis的zset来实现排行榜)5.有了解过Redisson吗?讲一下对于分布式锁的了解以及在什么场景下应用(说了秒杀场景)6.对mysql有了解吗?包括它的索引优化和创建(把想起来的全说了)7.了解设计模式吗?比如单例模式,为什么要使用单例模式,它的优点是什么(昨天刚看的设计模式)8.工厂模式有了解吗?主要的使用场景是?(也是昨天刚看的)9.场景题:有7个服务器,需要在早上十点定时的向数据库中的用户表中的用户发短信,如果做到发送的消息不重复,且如果发送失败了需要知道是到哪个用户失败了,这样下次就直接从这个用户开始(我答了用spring&nbsp;task来实现定时,用分布式锁来保证只有一份服务器可以发送消息,用消息队列来存储消息,然后用消息确认机制来保证错误信息的记录,以及在数据库或者业务层面完成消息消费的幂等性)10.场景题:如果在系统启动的时间就将数据库的所有用户相关的信息都读到一个hashmap中(这个没啥思路,没答好)27届的投了一个星期终于有一个面试了,大部分公司都只招26的
inari233:已oc,拒了
查看9道真题和解析
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务