『LeetCode|每日一题』---->省份数量

目录

作者简介:

『LeetCode|每日一题』 省份数量

1.每日一题

2.解题思路 

        2.1 思路分析

        2.2 核心代码(dfs) 

        2.3 全部代码


作者简介:

👨‍🎓一位20级的计科专业的新手,请各位大佬多多指教 

 🏡个人主页:XiaoChen_Android

📚学习专栏:力扣专栏

🕒发布日期:2022/8/7


『LeetCode|每日一题』 省份数量

1.每日一题

原文链接--->点我

2.解题思路 

        2.1 思路分析

        不难发现本题用深度优先搜索(dfs)和广度优先搜索(bfs)最为合适,我选择了dfs

        S1:要找的每个省份其实就是找这个图中所有的连通图(一个点组成的图也算一个连通图),所以遍历图中每个点的所有连通图即可;

        S2:dfs的设计:每次只遍历一个点,最后加一个循环即可,所以dfs中的参数核心是j,也就是该点与另外几个点的连接情况;

        S3:只要满足isConnect[i][j] == 1 && used[j] == false说明该两点是连通的,就可以继续遍历,但是要记得把used数组变为true;

        S4:dfs代码写好之后,它完成的是一个点的所有连通图,最后在外层加一个循环遍历每个点就可以了,当然也得加一个条件used[i] == false;

该题的时间复杂度为O(n^2),dfs和外层各用了一个for循环,此题只要合理的设计dfs方法那本体就相对而言比较简单了

        2.2 核心代码(dfs) 

public static void dfs(int i , int[][] isConnected , boolean[] used){
        int m = isConnected.length;
        int n = isConnected[0].length;
        for(int j = 0; j < n; j++){
            if(isConnected[i][j] == 1 && used[j] == false){
                used[i] = true;
                dfs(j ,isConnected,used);
            }
        }
    }

        2.3 全部代码

import java.util.Scanner;

public class Main2 {
    static int ans;
    public static void main(String[] args){
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        int[][] matrx = new int[n][n];
        for(int i = 0; i < n; i++){
            for(int j = 0; j < n; j++){
                matrx[i][j] = sc.nextInt();
            }
        }
        int res = findCircleNum(matrx);
        System.out.println(res);
    }
    public static int findCircleNum(int[][] isConnected) {
        ans = 0;
        int m = isConnected.length;
        int n = isConnected[0].length;
        boolean[] used = new boolean[m];
        for(int i = 0; i < m; i++){
            if(used[i] == false){
                dfs(i,isConnected,used);
                ans++;
            }
        }

        return ans;
    }
    public static void dfs(int i , int[][] isConnected , boolean[] used){
        int m = isConnected.length;
        int n = isConnected[0].length;
        for(int j = 0; j < n; j++){
            if(isConnected[i][j] == 1 && used[j] == false){
                used[i] = true;
                dfs(j ,isConnected,used);
            }
        }
    }
}

  🍁 类似题目推荐:

1.剑指offer专项练习

2.算法专项练习

3.推荐一个学习网站:LeetCode,算法的提升在于日积月累,只有每天练习才能保持良好的状态

如果文章对你有帮助就支持一下噢,新手尝试,很多地方可能语言组织不当,不好的地方请各位大佬多多指教! 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值