同一屋檐下 连更四集 狂喜 LeetCode 547. 省份数量

写在前面

晚上睡的有点晚,昨晚一直在搞排版和封面的事,在B站找了个视频跟着学做封面,感觉还不错,如何套路关注者,让他们更加感兴趣惦记你的文章。其实也是没学的太明白,只记得了封面要吸引人一点,不要简单的描述事实。晚上睡不着,一直在想怎么运营公众号,以及各个平台的联动,其实感觉自己有点想多了,这才开始,并且最初并不是这么一个想法, 最初想的是来记录自己刷题,生活,读书的一些日常感悟吧。我打算不想那么多了,安心做就完事了。记录自己某一段时间的生活,以后会不会有更多的地方可以回味,能吸引人就更好,哈哈哈!!!🤪

今天看了个综艺,同一屋檐下,吼吼,这综艺不得了,我刚开始其实是不太能看得下去的,因为我想着肯定又是那种很多滤镜的场景,一群人在一个地方谈恋爱。然后看了之后发现并没有滤镜,每个人性格都特别鲜明,而且经历也都特别丰富吧,职业不同,环境不同,所处的年龄段不同,一群人思想的碰撞💥,还是挺有趣的,虽说还是免不了的谈恋爱🤣,而且评论室里的那群人也可以给我们很丰富的一个看问题的观点,就仿佛在和一群人一起看着综艺,一起吐槽,交流。还不错,整体上来看。朋友们可以看起来哦。

题目详情

题目描述

有 n 个城市,其中一些彼此相连,另一些没有相连。如果城市 a 与城市 b 直接相连,且城市 b 与城市 c 直接相连,那么城市 a 与城市 c 间接相连。

省份 是一组直接或间接相连的城市,组内不含其他没有相连的城市。

给你一个 n x n 的矩阵 isConnected ,其中 isConnected[i][j] = 1 表示第 i 个城市和第 j 个城市直接相连,而 isConnected[i][j] = 0 表示二者不直接相连。

返回矩阵中 省份 的数量。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/number-of-provinces
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

示例 1:

输入:isConnected = [[1,1,0],[1,1,0],[0,0,1]]
输出:2

示例 2:

输入:isConnected = [[1,0,0],[0,1,0],[0,0,1]]
输出:3

示例 3:

输入:isConnected = [[1,1,0],[1,1,1],[0,1,1]]
输出:1

题解

思路

我在思考这个问题的时候,第一时间是想到了并查集,但是在后续实现的时候,发现到一个点,就是会不会存在A的父节点是B,已经更新过了,B的父节点是C,那么在计算省份的数量时,需要什么方式才能更加合适地计算出来。其实是我多虑了,以为只要当前的城市她的父节点不是自己,就证明有人和他相连,他就一定不是最上层的父节点,就可以不用记录他,只需要找到最上层的父节点来记录即可。不需要知道当前这个城市她的顶级父节点是谁,这个不重要。

步骤

第一步,处理数据。先建立父节点数组,并且初始化自己为自己的父节点。在按照已知数据进行处理,每一对连接的城市都需要进行合并父节点,这样两者就相通了。

第二步,求解。现在是已知父节点数组,求有多少个独立路径,只需要找到父节点是自己的那些节点,然后求和即可。

注意

代码

class Solution {
    public int findCircleNum(int[][] isConnected) {
        int n = isConnected.length;
        int[] res = new int[n];
        for(int i=0;i<n;i++){
            res[i] = i;
        }
        for(int i=0;i<n;i++){
            for(int j=i+1;j<n;j++){
                if(isConnected[i][j]==1){
                    union(i,j,res);
                }
            }
        }
        int num =0;
        for(int i=0;i<n;i++){
            if(res[i]==i){
                num++;
            }
        }
        return num;
    }
    private int find(int x,int[] f){
        if(f[x]!=x){
            f[x] = find(f[x],f);
        }
        return f[x];
    }

    private void union(int x,int y,int[] f){
        int fx = find(x,f);
        int fy = find(y,f);
        f[fx] = fy;
    }
}

总结

自己还是要提前理清楚思路,不能以上来看到熟悉的题目,还没有思考明白,就直接下笔,写到一半才发现自己卡壳了,那就很难受,有可能这个思路一开始就行不通,却浪费了时间。现在的我其实对于一般的题目都可以确定是用什么方法去完成它, 需要真正思考的是实现的细节是否合理,有没有别扭的地方,加油加油。🤔

欢迎关注我的公众号:方头狮的新世界

欢迎关注我的知乎专栏:方头狮的新世界

全部评论
加油
点赞
送花
回复
分享
发布于 2021-01-08 14:43

相关推荐

2 收藏 评论
分享
牛客网
牛客企业服务