leecode岛屿问题

一、leetcode200. 岛屿数量

   给你一个由 ‘1’(陆地)和 ‘0’(水)组成的的二维网格,请你计算网格中岛屿的数量。

岛屿总是被水包围,并且每座岛屿只能由水平方向和/或竖直方向上相邻的陆地连接形成。

此外,你可以假设该网格的四条边均被水包围。

输入:grid = [
[“1”,“1”,“1”,“1”,“0”],
[“1”,“1”,“0”,“1”,“0”],
[“1”,“1”,“0”,“0”,“0”],
[“0”,“0”,“0”,“0”,“0”]
]
输出:1

思路:岛屿问题都可以用dfs来解决,不用回溯,而是遍历,遍历后要标记遍历过的点,回到之前时候不用回溯,不是找路径不需要回溯,只需要遍历过就可以。

class Solution {
public:
    int numIslands(vector<vector<char>>& grid) {
        int res=0;
        for(int i=0;i<grid.size();i++)
          for(int j=0;j<grid[0].size();j++){
              if(grid[i][j]=='1'){
                  dfs(grid,i,j);
                  res++;
              }
          }
        return res;
    }

    void dfs(vector<vector<char>>& grid,int x,int y){         //注意此时不是要求路径或者排列,而是要求遍历所有为1 的陆地,即回溯的时候不需要回溯,前面遍历过这次就不便利了
       if(x<0 || x>=grid.size() || y<0 ||y>=grid[0].size() || grid[x][y]=='0')
         return;
       grid[x][y]='0';
       dfs(grid,x-1,y);
       dfs(grid,x+1,y);
       dfs(grid,x,y-1);
       dfs(grid,x,y+1);
    }
};

二、leetcode463. 岛屿的周长

   
463. 岛屿的周长

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

输入:grid = [[0,1,0,0],[1,1,1,0],[0,1,0,0],[1,1,0,0]]
输出:16
解释:它的周长是上面图片中的 16 个黄色的边
思路:同样的岛屿模板,如果遍历到0水域或者超出边界,就把周长加一

class Solution {
public:
    int islandPerimeter(vector<vector<int>>& grid) {
         int sum=0;
         for(int i=0;i<grid.size();i++)
          for(int j=0;j<grid[0].size();j++){
              if(grid[i][j]==1){
                  dfs(grid,i,j,sum);
                  break;
              }
          }
        return sum;
    }
    void dfs(vector<vector<int>>& grid,int i,int j,int& sum){
           if(i<0 || i>=grid.size() || j<0 ||j>=grid[0].size() || grid[i][j]==0) {sum++;return; }
           if(grid[i][j]==2) return;
           grid[i][j]=2;
           dfs(grid,i-1,j,sum);
           dfs(grid,i+1,j,sum);
           dfs(grid,i,j-1,sum);
           dfs(grid,i,j+1,sum);
    }
};


三、695. 岛屿的最大面积

   
463. 给你一个大小为 m x n 的二进制矩阵 grid 。岛屿 是由一些相邻的 1 (代表土地) 构成的组合,这里的「相邻」要求两个 1 必须在 水平或者竖直的四个方向上 相邻。你可以假设 grid 的四个边缘都被 0(代表水)包围着。岛屿的面积是岛上值为 1 的单元格的数目。计算并返回 grid 中最大的岛屿面积。如果没有岛屿,则返回面积为 0 。

输入:输入:grid = [[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]]
输出:6
解释:答案不应该是 11 ,因为岛屿只能包含水平或垂直这四个方向上的 1 。

class Solution {
public:
	 int maxAreaOfIsland(vector<vector<int>>& grid) {
		 int res=0;
		 for(int i=0;i<grid.size();i++)
			 for (int j = 0; j < grid[0].size(); j++) {
				 if (grid[i][j] == 1) {
					 int sum = 0;
					 dfs(grid,i,j,sum);
					 res = max(res,sum);
				 }
			 }
		 return res;
	 }
	 void dfs(vector<vector<int>>& grid,int i,int j,int & sum) {
		 if (i < 0 || i >= grid.size() || j<0 || j>=grid[0].size() || grid[i][j] == 0 ) return;
		 grid[i][j] = 0;
		 sum++;
		 dfs(grid,i-1,j,sum);
		 dfs(grid, i + 1, j, sum);
		 dfs(grid, i, j - 1, sum);
		 dfs(grid, i , j+1, sum);
	 }
};


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值