827. 最大人工岛
题目链接:827. 最大人工岛
代码如下:
class Solution
{
public:int largestIsland(vector<vector<int>>& grid) {unordered_map<int,int> gridNum;int n=grid.size(), m = grid[0].size();bool isAllGrid=true;// 标记是否整个地图都是陆地vector<vector<bool>> visited(n,vector<bool>(n,false));int mark=2;//每座岛的标记for(int i=0;i<n;i++){for(int j=0;j<m;j++){if(grid[i][j]==0) isAllGrid=false;if(!visited[i][j]&&grid[i][j]==1){count=0;dfs(grid,visited,i,j,mark);gridNum[mark]=count;mark++;}}}if(isAllGrid) return n*m;int res=0;unordered_set<int> visitedGrid;//标记访问过的岛屿for(int i=0;i<n;i++){for(int j=0;j<m;j++){int count=1;//记录连接之后的岛屿数量visitedGrid.clear();if(grid[i][j]==0){for(int k=0;k<4;k++){int neari=i+dir[k][1];int nearj=j+dir[k][0];if(neari<0||neari>=n||nearj<0||nearj>=m) continue;if(visitedGrid.count(grid[neari][nearj])) continue;//添加过的岛屿不要重复添加count+=gridNum[grid[neari][nearj]];visitedGrid.insert(grid[neari][nearj]);}}res=max(res,count);}}return res;}
private:int dir[4][2] = {0, 1, 1, 0, -1, 0, 0, -1}; // 四个方向int count;//深度优先遍历void dfs(vector<vector<int>>& grid,vector<vector<bool>>& visited,int x,int y,int mark){if(visited[x][y]||grid[x][y]==0) return;visited[x][y]=true;// 标记访问过grid[x][y]=mark;// 给陆地标记新标签count++;for(int i=0;i<4;i++){int nextX=x+dir[i][0],nextY=y+dir[i][1];//越界if(nextX<0||nextX>=grid.size()||nextY<0||nextY>=grid[0].size())continue;dfs(grid,visited,nextX,nextY,mark);}}
};