2021/01/07 每日一题 省份数量

LeetCode上省份数量,记录下解题思路
这里使用了并查集的思路,这里有个比较好的文章并查集详解可以看看
假如传入[[1,1,0],[1,1,0],[0,0,1]]
循环建立一个数组,数组每个元素是一个对象,保存当前的index以及元素的父亲(这里将父亲设为自己)
对于上面的数组创建的对象如下,这里的Node永远指向自己


接下来需要做的操作是一个双重for循环,对应取出第一个子数组,因为每个数组中都要保存和所有节点的关系,连接就是1,不连接就是0

 // 对传入的数组中的每个元素进行循环
    for (let i = 0; i < M.length; i++) {
      // 对每个子元素的元素循环,双数组循环
      for (let j = 0; j < M.length; j++) {
         // 如果这个元素是存在的
          if (M[i][j]) {
              xRoot = find(arr[i])
              yRoot = find(arr[j])
              xRoot.parent = yRoot
          } 
      }
    }

i=0 j=0 执行find(arr[0])和find(arr[0]),这里arr[0]的parent都没有更改

i=0 j=1 执行find(arr[0])和find(arr[1]),这里arr[0]和arr[1]的parent也没有更改,但find(arr[i]).parent = find(arr[j])的操作让,arr[0].parent = arr[1]了

i=0 j=2 M[0][2]不存在不进入操作
此时整个arr为

[
{val:0,parent:{val:1,parent:Node}},
{val:1,parent:{val:1,parent:Node}},
{val:2,parent:{val:2,parent:Node}}
]

第一次外层循环结束
i=1 j=0 执行find(arr[1])和find(arr[0]),arr[1]的parent还是arr[1]自己,arr[0]的parent因为第一次外层循环变为arr[1]了,在find中就要进行递归操作,寻找arr[1]的parent,这里也还是本身,那么就返回arr[1],所以最后````find(arr[i]).parent = find(arr[j])```的操作还是将arr[1]的parent设为arr[1]。

i=1 j=1 执行find(arr[1])和find(arr[1]),arr[1]的parent是arr[1]自己,无操作

i=1 j=2 M[0][2]不存在不进入操作
第二次外层循环结束
i=2 j=0 M[2][0]不存在不进入操作

i=2 j=1 M[2][1]不存在不进入操作

i=2 j=2 执行find(arr[2])和find(arr[2]),arr[1]的parent还是arr[1]自己,所以最后也没有对arr[2]进行更改。
第三次外层循环结束
至此arr数组对象已经连接完成,接下来只要遍历arr数组,找到内部对象有多少个的元素父节点还是自己的节点个数,那么这些节点数就是所求。
用一个for循环就能搞定


上图就是根据最后的arr画的图,我们只要计算有几个元素的parent是本身就可以了


var findCircleNum = function (M) {
   // 查找父元素函数
     let find = function (x) {
     if (x !== x.parent)
         return find(x.parent)
     return x.parent
   }
   // 节点类
   class Node {
      constructor (val) {
         // 储存当前节点对应的index
         this.val = val
         // 节点的parent
         this.parent = this
      }
   }
    // 创建一个M长度数组,这个数组的每个元素都是一个Node对象
    // 所有元素的父元素都是自己本身
    const arr = []
    for (let i = 0; i < M.length; i++) {
        arr[i] = new Node(i)
    }
    // 对传入的数组中的每个元素进行循环
    for (let i = 0; i < M.length; i++) {
      // 对每个子元素的元素循环,双数组循环
      for (let j = 0; j < M.length; j++) {
         // 如果这个元素是存在的
          if (M[i][j]) find(arr[i]).parent = find(arr[j])
      }
    }
    // res是结果
    let res = 0
    // 用tmp来记录
    // 开始遍历arr数组
    for (let i = 0; i < arr.length; i++) {
      // 如果当前元素的父元素是本身,那么这个就是最中心的那个,有多少个元素这个就有多少个结果
      if(arr[i].parent === arr[i]) res++
    }
    // 返回结果
    return res
};
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,542评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,596评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,021评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,682评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,792评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,985评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,107评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,845评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,299评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,612评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,747评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,441评论 4 333
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,072评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,828评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,069评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,545评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,658评论 2 350

推荐阅读更多精彩内容