列表

详情


NC185. 岛屿的最大面积

描述

给定一个用 n*m 矩阵表示的群岛的地图,其中 1 表示岛屿, 0 表示海洋,每个岛屿的水平或竖直方向相邻的岛屿可以视为连在一起的岛屿,每一块岛屿视为面积为 1 ,请问面积最大的岛屿是多少。

例如:
当输入[[1,0],[0,1]]时,对应的地图为:

只有在水平或竖直方向相邻的岛屿可以连在一起,所以每个岛屿互相独立。最大面积是1

当输入[[1,1],[1,0]]时,对应的地图为:

三块岛屿可以连在一起,最大面积是3

数据范围:

示例1

输入:

[[1,0],[0,1]]

输出:

1

说明:

如题面解释

示例2

输入:

[[1,1],[1,0]]

输出:

3

说明:

如题面解释

示例3

输入:

[[0]]

输出:

0

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++ 解法, 执行用时: 3ms, 内存消耗: 404KB, 提交时间: 2022-04-18

class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param grid int整型vector<vector<>> 
     * @return int整型
     */
    int maxAreaIsland(vector<vector<int> >& grid) {
        // write code here
        int nr = grid.size();
        if(nr == 0) return 0;
        int nc = grid[0].size();

        int nums_island = 0;
        int max_s = 0;
        for(int r = 0; r < nr; ++r)
        {
            for(int c = 0; c < nc; ++c)
            {
                int mianji = 0;
                if(grid[r][c] == 1)
                {
                    ++nums_island;
                    mianji++;
                    grid[r][c] = 0;
                    queue<pair<int, int>> qq;
                    qq.push({r, c});
                    while(!qq.empty())
                    {
                        auto rc = qq.front();
                        qq.pop();
                        int row = rc.first, col = rc.second;
                        if(row - 1 >= 0 && grid[row-1][col] == 1)
                        {
                            qq.push({row - 1, col});
                            grid[row - 1][col] = 0;
                            mianji++;
                        }
                        if(row + 1 < nr && grid[row + 1][col] == 1)
                        {
                            qq.push({row + 1, col});
                            grid[row + 1][col] = 0;
                            mianji++;
                        }
                        if(col - 1 >= 0 && grid[row][col - 1] == 1)
                        {
                            qq.push({row, col - 1});
                            grid[row][col - 1] = 0;
                            mianji++;
                        }
                        if(col + 1 < nc && grid[row][col + 1] == 1)
                        {
                            qq.push({row, col + 1});
                            grid[row][col + 1] = 0;
                            mianji++;
                        }

                    }
                    max_s = max(max_s, mianji);


                }
                
            }
        }
        return max_s;
    }
};

C++ 解法, 执行用时: 3ms, 内存消耗: 408KB, 提交时间: 2022-05-08

class Solution {
  public:
    int maxAreaIsland(vector<vector<int> >& grid) {
        int nr = grid.size();
        if (nr == 0) return 0;
        int nc = grid[0].size();
        int nums_island = 0;
        int max_s = 0;
        for (int r = 0; r < nr; ++r) {
            for (int c = 0; c < nc; ++c) {
                int mianji = 0;
                if (grid[r][c] == 1) {
                    ++nums_island;
                    mianji++;
                    grid[r][c] = 0;
                    queue<pair<int, int>> qq;
                    qq.push({r, c});
                    while (!qq.empty()) {
                        auto rc = qq.front();
                        qq.pop();
                        int row = rc.first, col = rc.second;
                        if (row - 1 >= 0 && grid[row - 1][col] == 1) {
                            qq.push({row - 1, col});
                            grid[row - 1][col] = 0;
                            mianji++;
                        }
                        if (row + 1 < nr && grid[row + 1][col] == 1) {
                            qq.push({row + 1, col});
                            grid[row + 1][col] = 0;
                            mianji++;
                        }
                        if (col - 1 >= 0 && grid[row][col - 1] == 1) {
                            qq.push({row, col - 1});
                            grid[row][col - 1] = 0;
                            mianji++;
                        }
                        if (col + 1 < nc && grid[row][col + 1] == 1) {
                            qq.push({row, col + 1});
                            grid[row][col + 1] = 0;
                            mianji++;
                        }
                    }
                    max_s = max(max_s, mianji);
                }
            }
        }
        return max_s;
    }
};

C++ 解法, 执行用时: 3ms, 内存消耗: 412KB, 提交时间: 2022-02-18

class Solution {
public:
    int vis[55][55]={0};//判断是否访问过
    int a[4][2]={{-1,0},{0,1},{1,0},{0,-1}};//四个方向
    int res=0,n,m;
    int cnt;
    int maxAreaIsland(vector<vector<int> >& grid) {
        n=grid.size();
        if(n==0)
            return 0;
        m=grid[0].size();
        for(int i=0;i<n;i++){
            for(int j=0;j<m;j++){
                if(vis[i][j]==0&&grid[i][j]==1){//如果未访问过,则访问
                    bfs(i,j,grid);
                    res=max(cnt,res);//维护最大值
                }
            }
        }
        return res;
    }
    
    void bfs(int x,int y,vector<vector<int> >& grid){
        queue<pair<int,int>> q;//队列
        q.push({x,y});//入队
        vis[x][y]=1;
        cnt=1;//面积初始化为1
        while(!q.empty()){
            auto t=q.front();
            q.pop();//出队
            for(int i=0;i<4;i++){//遍历四个方向
                int nx=t.first+a[i][0],ny=t.second+a[i][1];
                if(nx<0||nx>=n||ny<0||ny>=m){//下标越界判断
                    continue;
                }
                if(vis[nx][ny]==0&&grid[nx][ny]==1){//如果未访问过,则访问
                    q.push({nx,ny});
                    vis[nx][ny]=1;
                    cnt++;
                }
            }
        }
    }
};

C++ 解法, 执行用时: 3ms, 内存消耗: 428KB, 提交时间: 2022-06-10

class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param grid int整型vector<vector<>> 
     * @return int整型
     */
    
    void dfs(vector<vector<int> >& grid, int i, int j, int r, int c)
    {
        int counter = 0 ;
        queue<pair<int,int>> mq;
        pair<int,int> p;
        mq.push(pair<int,int>(i,j));
        counter++;
        while(!mq.empty())
        {
            p = mq.front();
            grid[p.first][p.second] = 0;
            if(p.first-1>=0)
            {
                if(grid[p.first-1][p.second]==1)
                {
                    counter++;
                    grid[p.first-1][p.second] = 0;
                    mq.push(pair<int,int>(p.first-1, p.second));
                }
            }
            if(p.first+1<r)
            {
                if(grid[p.first+1][p.second]==1)
                {
                    counter++;
                    grid[p.first+1][p.second] = 0;
                    mq.push(pair<int,int>(p.first+1, p.second));
                }
            }
            if(p.second-1>=0)
            {
                if(grid[p.first][p.second-1]==1)
                {
                    counter++;
                    grid[p.first][p.second-1] = 0;
                    mq.push(pair<int,int>(p.first, p.second-1));
                }
            }
            if(p.second+1<c)
            {
                if(grid[p.first][p.second+1]==1)
                {
                    counter++;
                    grid[p.first][p.second+1] = 0;
                    mq.push(pair<int,int>(p.first, p.second+1));
                }
            }
            mq.pop();
        }
        if(counter>maxi)
            maxi = counter;
        
    }
    
    
    int maxi = 0;
    int maxAreaIsland(vector<vector<int> >& grid) {
        // write code here
        int r = grid.size(), c = grid[0].size();
        for(int i=0;i<r;i++)
            for(int j=0;j<c;j++)
            {
                if(grid[i][j]==1)
                {
                    dfs(grid,i,j,r,c);
                }
            }
        return maxi;
    }
};

C++ 解法, 执行用时: 3ms, 内存消耗: 432KB, 提交时间: 2022-02-23

class Solution {
public:
    int enc(int i,int j,int sz){
        return i*sz+j;
    }
    // 获取并查集根
    int getfa(vector<pair<int,int> > & v2fc, int i){
        if(i == v2fc[i].first)return i;
        int r = getfa(v2fc, v2fc[i].first);
        v2fc[i] = v2fc[r];
        return r;
    }
    // 合并并查集并返回合并后的大小
    int merge(vector<pair<int,int> > & v2fc,int i,int j){
        auto ri = getfa(v2fc,i);
        auto rj = getfa(v2fc,j);
        if(ri == rj)return v2fc[ri].second; // 本就是一个
        // 合并 rj为新的根
        v2fc[rj].second += v2fc[ri].second; // 更新并查集点数 
        v2fc[ri] = v2fc[rj];
        return v2fc[rj].second;
    }
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param grid int整型vector<vector<>> 
     * @return int整型
     */
    int maxAreaIsland(vector<vector<int> >& grid) {
        // 块 => 并查集父节点(father),并查集大小(count)
        // 只有根是自己的 second才是准确的,根不是自己的节点的second是无效值
        vector<pair<int,int> > v2fc(grid.size()*grid[0].size());
        for(int i = 0;i<v2fc.size();i++){
            v2fc[i] = {i,1};
        }
        int area = 0;
        int di[] = {1,0};
        int dj[] = {0,1};
        for(int i = 0;i<grid.size();i++){
            for(int j = 0;j<grid[0].size();j++){
                if(grid[i][j] == 0)continue;
                area = max(area,1); // 没有两两相连的情况
                for(int k = 0;k < 2;k++){ // 两个方向
                    auto ni = i + di[k]; // 相邻坐标的i
                    auto nj = j + dj[k]; // 相邻坐标的j
                    // 坐标不合法
                    if(ni >= grid.size() || nj >= grid[0].size() )continue;
                    // 非1
                    if(grid[ni][nj] == 0)continue;
                    area = max(
                        area,
                        merge(
                            v2fc,
                            enc(i,j,grid[0].size()),
                            enc(ni,nj,grid[0].size())
                        )
                    );
                }
            }
        }
        return area;
    }
};

上一题