图论--矩阵+连接组件

文章目录

  • 200.岛屿的数量
    • 题目描述
    • 设计思路
    • 编码
  • 547.省份数量
    • 题目描述
    • 设计思路
    • 编码
  • 695.岛屿的最大面积
    • 题目描述
    • 解题思路
    • 编码

声明:本题来自力扣,点击标题可以跳转到相应题目,题库整理来自花花酱整理的题目Graph(图论)图论--矩阵+连接组件_第1张图片

200.岛屿的数量

题目描述

图论--矩阵+连接组件_第2张图片

这是一道很经典的图论的题目,以及由它延申出来的各种算法都是十分经典的。话不多说,来解题。
在这个网格矩阵中,我们要一个一个遍历这些格子,并且判断这个格子是否有接壤的格子。

设计思路

  1. 我们从grid[0][0]开始遍历,可以使用深度优先,也可以使用广度优先
  2. 如果第一个格子是1,我们就计数count++并且进入到dfs函数中。如果是0就遍历下一个格子,直到找到为1的格子。
  3. dfs的工作:首先看过来的格子有没有越界,是否有超过地图,然后判断是0还是1,是1继续遍历,是0返回。
    图论--矩阵+连接组件_第3张图片

编码

class Solution {
    public int numIslands(char[][] grid) {
        if(grid == null || grid.length == 0){
            return 0;
        }

        int gx = grid.length;
        int gy = grid[0].length;
        int islandCount = 0;

        for(int x = 0; x < gx; x++){
            for(int y = 0; y < gy; y++){
                if(grid[x][y] == '1'){
                    islandCount ++;
                    dfs(grid,x,y);
                }
            }
        }

        return islandCount;
    }
    public void dfs(char[][] grid, int x, int y){
        int gx = grid.length;
        int gy = grid[0].length;
        
        if(x < 0 || y < 0 || x >= gx || y >= gy || 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);
    }
}

547.省份数量

题目描述

图论--矩阵+连接组件_第4张图片
首先这是一个NxN的矩阵,而且每一个数字代表了一个城市,那我们可以试图将城市分布图的二维变成一维的。然后再使用数据算法去模拟一张图。
图论--矩阵+连接组件_第5张图片

设计思路

  1. 我们首先需要一个数据结构来记录哪些省份去过了,这里我们使用boolean形的数组(如上图)
  2. 我们需要一个队列,来记录当前的城市可以到另外的哪些城市去(使用队列和一维数组模拟图模拟图)图论--矩阵+连接组件_第6张图片
    _15,color_FFFFFF,t_70,g_se,x_16#pic_center)
    图论--矩阵+连接组件_第7张图片
    图论--矩阵+连接组件_第8张图片
    就是类似这样的思路就可以了。可能写的不好就看代码和注解把

编码

class Solution {
    public int findCircleNum(int[][] isConnected) {
        int provinces = isConnected.length;
        //存储已经访问过的城市,拥有的城市数就是矩阵的宽度,最开始都是false
        boolean[] visited = new boolean[provinces];
        //用来计数,计省份的数量
        int circles = 0;
        Queue<Integer> queue = new LinkedList<Integer>();
        for (int i = 0; i < provinces; i++) {
            //如果没有访问过
            if (!visited[i]) {
                //把这个加入队列中
                queue.offer(i);
                while (!queue.isEmpty()) {
                    //将队列中访问过的城市出队,并标记为true,表明访问过了
                    int j = queue.poll();
                    visited[j] = true;
                    //查看一下和这个城市相邻的城市,并标记他们
                    for (int k = 0; k < provinces; k++) {
                        if (isConnected[j][k] == 1 && !visited[k]) {
                            queue.offer(k);
                        }
                    }
                }
                //结束上面的if就结束了
                circles++;
            }
        }
        return circles;
    }
}

695.岛屿的最大面积

题目描述

图论--矩阵+连接组件_第9张图片

解题思路

这个和本文章第一题200岛屿数量是一样的,我们只要修改一下代码,把计岛屿数量的计数变成计面积大小的计数就可以了

编码

class Solution {
    public int dfs(int[][] grid, int x, int y){
        int gx = grid.length;
        int gy = grid[0].length;

        if(x < 0 || x > gx || y < 0 || y > gy || grid[x][y] == 0){
            return 0;
        }

        grid[x][y] = 0;
        int area = 1;
        area += dfs(grid,x+1,y);
        area += dfs(grid,x-1,y);
        area += dfs(grid,x,y+1);
        area += dfs(grid,x,y-1);
        return area;  

    }
    public int maxAreaOfIsland(int[][] grid) {
        int maxArea = 0;
        int area = 0;
        //x
        int gx = grid.length;
        //y
        int gy = grid[0].length;

        for(int i = 0; i < gx; i++){
            for(int j = 0; j < gy; j++){
                if(grid[i][j] == 1){
                    maxArea = Math.max(maxArea,dfs(grid,i,j));                   
                 }
            }
        }
        return maxArea;
    }
}

你可能感兴趣的:(leetcode,深度优先,算法,图论,广度优先)