算法系列--LeetCode(三)矩阵求岛屿数量

一个N*M的矩阵只有0、1两种元素,1为陆地0为海洋。相邻(上下左右四个方向)即为同一块陆地,输出矩阵中岛屿数量。

算法的“广度优先”还是“深度优先”:
    1.广度:一行一行遍历记录岛屿状态以及岛屿产生与合并情况。
    2.深度:从一个节点开始四个方向去寻找连接岛屿,并标记寻找过的位置。

这里采用的是深度优先递归实现,非递归实现需要借助栈。

代码: 

/**
 * 二维矩阵岛屿问题:0 - 海,1 - 陆地,相邻上下左右
 */
class Demo3 implements AbstractDemo {

    private int[][] data;

    @Override
    public void getData() {
        int length = 10, width = 10;
        System.out.println("岛屿结构:");
        data = new int[length][width];
        for (int i = 0; i < length; i++) {
            System.out.print("[");
            for (int j = 0; j < width; j++) {
                data[i][j] = Math.random() > 0.5 ? 1 : 0;
                System.out.print(data[i][j] + " ");
            }
            System.out.print("]\n");
        }
    }

    @Override
    public void calculate() {
        // 记录当前岛屿数量
        int island = 0;
        // 判断并更新岛屿状态
        for (int i = 0; i < data.length; i++) {
            for (int j = 0; j < data[i].length; j++) {
                if (data[i][j] == 1) {
                    island++;
                    data[i][j] = 2;
                    merge(i, j);
                }
            }
        }
        System.out.println("岛屿数:" + island);
    }

    /**
     * 判断当前节点周围是否有岛屿并且修改岛屿标记
     */
    private void merge(int i, int j) {
        // 上
        if (i - 1 >= 0 && data[i - 1][j] == 1) {
            data[i - 1][j] = 2;
            merge(i - 1, j);
        }
        // 下
        if (i + 1 < data.length && data[i + 1][j] == 1) {
            data[i + 1][j] = 2;
            merge(i + 1, j);
        }
        // 左
        if (j - 1 >= 0 && data[i][j - 1] == 1) {
            data[i][j - 1] = 2;
            merge(i, j - 1);
        }
        // 右
        if (j + 1 < data[i].length && data[i][j + 1] == 1) {
            data[i][j + 1] = 2;
            merge(i, j + 1);
        }
    }

    public static void main(String[] args) {
        Demo3 demo3 = new Demo3();
        demo3.getData();
        demo3.calculate();
    }
}

补一个二叉树遍历博客:https://www.cnblogs.com/attitudeY/p/6790219.html

你可能感兴趣的:(算法)