Pocket_Gems 跪经之Zoombie/Friend Circles

大概偷了这么些题目吧:

Pocket_Gems 跪经之Zoombie/Friend Circles_第1张图片
Pocket_Gems 跪经之Zoombie/Friend Circles_第2张图片

刚看到这题的时候我是有点开心的,因为忽略掉这些文字就发现简直跟Leetcode Number of Island 那道题一样。

【事实证明不一样 T^T...】

用Number of Island那题的解法可以过sample test case。 但是面对一些很坑爹的case是过不去的。


比如

10000

01000

00100

00010

00011

Expected Answer: 5

DFS到第四行的时候会顺便往下走,然后把第五行第四个元素变成0,然后继续往右走,然后把第五行最后一个变成0.

这样总共他就会计算出 有4个isolated zoombie groups.


Pocket_Gems 跪经之Zoombie/Friend Circles_第3张图片

我这里其实应该最后多加一个if case.

if(arr[row][col] !=1 || arr[col][row]) != 1的话,也就是 你认我为朋友,我不认识你的话,这样就不应该算一伙的。

T^T 就差一个if case 没想到。。。考的时候还是太紧张了


Edit on 7/28.

晚上逛Leetcode,本来以为Friend Circles是约瑟夫问题 结果发现竟然就是Pocket_gems的zoombie!!!

Pocket_Gems 跪经之Zoombie/Friend Circles_第4张图片

看完答案发现。。。这道题比我想的要难的多的多的多。。。Pocket Gems ヽ(*。>Д<)o゜

主流的做法大概可以分为DFS 和 Union Find (完全超出我之前准备的。。。)


Pocket_Gems 跪经之Zoombie/Friend Circles_第5张图片


Pocket_Gems 跪经之Zoombie/Friend Circles_第6张图片

Adjancy Matrix: 

左边rows是ith person, cols是其他所有人。1表示是朋友,0表示不是朋友。 用DFS的方式,先从Person 0看一下谁是他朋友,看到person2 是他朋友,然后recursively 去到person2 看person2 有谁是朋友, 然后全部visit一遍。到最后停下来的时候就代表已经把Person 0的所有transistive 朋友圈看完了。沿途中,会把经过的人化成同一个group的人。下一轮开始的时候,会挑不在之前的group里的人,也就是unvisisted的。

Pocket_Gems 跪经之Zoombie/Friend Circles_第7张图片
Pocket_Gems 跪经之Zoombie/Friend Circles_第8张图片
Pocket_Gems 跪经之Zoombie/Friend Circles_第9张图片

一开始initialize root array. 每一个person 一开始都以自己为单位, 编号为index。如果就此结束,那么我们会有N个isolated groups. 但是现在要开始搜索朋友圈。iterate People List. 对于每一个人,traverse to 他的好友,也就是 M[i][j] == 1的人。 比如说person0的好友有person1,我们对index [0,1] apply Union Find。 发现目前Person0 的root为0, person1的root为1. 但是他们又是好朋友。 所以我们merge 他们的root,让root[1] = 0 也就是被traverse的人归到person0的group里。 

最后看一下Root的列表。 跟person本身index一样的才算一个队伍,因为跟自己不一样index的表示这个人已经进了另一个人的队伍里去了。

这个解法用root[] 来keep track of parents. 一般的unionFind会定义一个Find方法,来找parents。

Pocket_Gems 跪经之Zoombie/Friend Circles_第10张图片


跟这道题相似的类型还有 Graph Valid Tree, Number of Island 2,  Number of Connected Components.

你可能感兴趣的:(Pocket_Gems 跪经之Zoombie/Friend Circles)