leetcode 水域大小(DFS)

这篇博客介绍了一种使用深度优先搜索(DFS)算法来解决二维矩阵中水域面积的问题。代码实现中,首先遍历矩阵找到所有0值(代表水域),然后通过DFS对每个0值进行搜索,统计其连通区域的大小。搜索过程中使用了标记数组避免重复统计,并在结束后对结果进行排序。边界条件处理得当,确保了不越界。最后返回排序后的水域面积列表。
摘要由CSDN通过智能技术生成

题目

思路及代码

1、全通过代码

与其他DFS题不同的地方:

1、递归开始调用的地方,每个0统计后就不能再次进行统计了,所以在主方法进行调用的地方要先判断flag是否为false,保证该位置没有被统计到水域中;

2、对输出进行排序(题目要求);

3、边界值问题

   主方法调用处: i< length  或i<= length-1;

    递归处:不能取到的临界值,比如length不能取到,所以等于也不行。

import java.util.ArrayList;
import java.util.Collections;
class Solution {
    public int[] pondSizes(int[][] land) {
      // 垂直 i+-1,j    水平 i,j+-1     
      //对角  左上 i-1,j-1  左下 i-1,j+1   右上 i+1,j-1  右下   i+1,j+1
      ArrayList<Integer> save = new ArrayList<>();
     
      int rows= land.length;
      int cols = land[0].length; 
      boolean [][] flag = new boolean [rows][cols];
      for(int i= 0;i<rows;i++){
          for(int j = 0;j< cols;j++){
             if(land[i][j]== 0 && flag[i][j] == false){
                 save.add(search(land,flag,rows,cols,i,j));
             }
          }
      }
       Collections.sort(save);
      int len = save.size();
      int [] size = new int [len];
      for(int i = 0;i<len;i++){
          size[i] = save.get(i);
      }
      return size;
    }
    public int search (int [][] land,boolean [][] flag,int rows,int cols,int i,int j){
        if(i<0 || i>= rows || j<0 || j>= cols|| flag[i][j] == true || land [i][j] !=0){
            return 0;
        }
        flag[i][j] = true;
        return(1+ search(land,flag,rows,cols,i-1,j)+//上
                  search(land,flag,rows,cols,i+1,j)+//下
                  search(land,flag,rows,cols,i,j-1)+
                  search(land,flag,rows,cols,i,j+1)+
                  search(land,flag,rows,cols,i-1,j-1)+
                  search(land,flag,rows,cols,i-1,j+1)+
                  search(land,flag,rows,cols,i+1,j-1)+
                  search(land,flag,rows,cols,i+1,j+1)
        );
    }
}
import java.util.ArrayList;
class Solution {
    public int[] pondSizes(int[][] land) {
      // 垂直 i+-1,j    水平 i,j+-1     
      //对角  左上 i-1,j-1  左下 i-1,j+1   右上 i-1,j-1  右下   i+1,j+1
      ArrayList<Integer> save = new ArrayList<>();
     
      int rows= land.length-1;
      int cols = land[0].length-1; 
      boolean [][] flag = new boolean [rows][cols];
      for(int i= 0;i< rows;i++){
          for(int j = 0;j< cols;j++){
             if(land[i][j]== 0){
                 save.add(search(land,flag,rows,cols,i,j));
             }
          }
      }
      int len = save.size();
      int [] size = new int [len];
      for(int i = 0;i<len;i++){
          size[i] = save.get(i);
      }
      return size;
    }
    public int search (int [][] land,boolean [][] flag,int rows,int cols,int i,int j){
        if(i<0 || i>= rows || j<0 ||j>= cols|| flag[i][j] == true || land [i][j] !=0){
            return 0;
        }
        flag[i][j] = true;
        return(1+ search(land,flag,rows,cols,i-1,j)+
                  search(land,flag,rows,cols,i+1,j)+
                  search(land,flag,rows,cols,i,j-1)+
                  search(land,flag,rows,cols,i,j+1)+
                  search(land,flag,rows,cols,i-1,j-1)+
                  search(land,flag,rows,cols,i-1,j+1)+
                  search(land,flag,rows,cols,i-1,j-1)+
                  search(land,flag,rows,cols,i+1,j+1)
        );
    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值