岛屿的最大面积(广度搜索,vector,queue队列leetcode695)-------------------c++实现

岛屿的最大面积(广度搜索,vector,queue队列leetcode695)-------------------c++实现

题目表述

给你一个大小为 m x n 的二进制矩阵 grid 。

岛屿 是由一些相邻的 1 (代表土地) 构成的组合,这里的「相邻」要求两个 1 必须在 水平或者竖直的四个方向上 相邻。你可以假设 grid 的四个边缘都被 0(代表水)包围着。

岛屿的面积是岛上值为 1 的单元格的数目。

计算并返回 grid 中最大的岛屿面积。如果没有岛屿,则返回面积为 0 。

样例

s 在这里插入图片描述

条件

m == grid.length
n == grid[i].length
1 <= m, n <= 50
grid[i][j] 为 0 或 1

思路

广搜,记录最大值

注意点

先对gird判断再对visit判断

ac代码

c++:

可以把find函数写到maxareaofinland方法里,速度会快很多。

#include <iostream>
#include <string>
#include <vector>
#include<queue>
#include<bits/stdc++.h>
using namespace std;

class Solution {
public:
           int x1[4]={-1,0,1,0};
           int y1[4]={0,-1,0,1};//上左下右
    int find(vector<vector<int> > grid,vector<vector<int> > &visit,int r,int l){
//        cout<<"function enter:"<<"r:  "<<r<<"   l:  "<<l<<endl;
        int sum=1;
        int line=grid[0].size();
          int row=grid.size();
          int now;
        queue<int> q;
        visit[r][l]=1;
        q.push(r*line+l);
        while(!q.empty()){
            now=q.front();
            q.pop();
            for(int i=0;i<4;i++)
            {
                r=now/line+x1[i];
            l=now%line+y1[i];
            if(r>=0&&r<row&&l>=0&&l<line)
            if(grid[r][l]&&visit[r][l]==0){
                sum++;
                visit[r][l]++;
                q.push(r*line+l);
            }
            }
        }
//    cout<<"sum:   "<<sum<<endl;
    return sum;
    }
    int maxAreaOfIsland(vector<vector<int> >& grid) {

           int max=0,now;
          vector<vector<int> > visit(grid.size(),vector<int>(grid[0].size(),0));
          for(int i=0;i<grid.size();i++)
            for(int j=0;j<grid[0].size();j++)
              if(visit[i][j]==0&&grid[i][j]){
                now=find(grid,visit,i,j);
              if(now>max)max=now;
              }
              return max;

    }
    /↑为leetcode通过的代码


    void show(vector<vector<int> > x){
    for(int i=0;i<x.size();i++)
       {
        for(int j=0;j<x[0].size();j++)
        cout<<x[i][j]<<" ";
       cout<<endl;
       }
}
};

int main()
{
  vector<vector<int> > a(8,vector<int>(13));
  int x[8][13]= {{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}};
  for(int i=0;i<8;i++)
  for(int j=0;j<13;j++)
    a[i][j]=x[i][j];
  Solution s;
  s.show(a);
  int result;
//  memset(a,0,sizeof(a));
  result=s.maxAreaOfIsland(a);
  cout<<result<<endl;
  s.show(a);
    return 0;
}

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/squares-of-a-sorted-array
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值