大概偷了这么些题目吧:
刚看到这题的时候我是有点开心的,因为忽略掉这些文字就发现简直跟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.
我这里其实应该最后多加一个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 ヽ(*。>Д<)o゜
主流的做法大概可以分为DFS 和 Union Find (完全超出我之前准备的。。。)
Adjancy Matrix:
左边rows是ith person, cols是其他所有人。1表示是朋友,0表示不是朋友。 用DFS的方式,先从Person 0看一下谁是他朋友,看到person2 是他朋友,然后recursively 去到person2 看person2 有谁是朋友, 然后全部visit一遍。到最后停下来的时候就代表已经把Person 0的所有transistive 朋友圈看完了。沿途中,会把经过的人化成同一个group的人。下一轮开始的时候,会挑不在之前的group里的人,也就是unvisisted的。
一开始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。
跟这道题相似的类型还有 Graph Valid Tree, Number of Island 2, Number of Connected Components.