1 class Solution:
 2     def getLevelFriends(self,friends,visited,id,level,l):
 3         while len(l) > 0 and level > 0:
 4             temp = []
 5             while len(l) > 0:
 6                 cur = l.pop()
 7                 flist = friends[cur]
 8                 for f in flist:
 9                     if visited[f] == 0:
10                         visited[f] = 1
11                         temp.append(f)
12             l = temp[:]
13             temp.clear()
14             level -= 1
15         return l
16 
17 
18     def watchedVideosByFriends(self, watchedVideos: 'List[List[str]]', friends: 'List[List[int]]', id: int, level: int) -> 'List[str]':
19         n = len(watchedVideos)
20         visited = [0] * n
21         visited[id] = 1
22         friendlist = self.getLevelFriends(friends,visited,id,level,[id])
23         #print(friendlist)
24         videscounts = {}
25         for f in friendlist:
26             videos = watchedVideos[f]
27             for v in videos:
28                 if v not in videscounts:
29                     videscounts[v] = 1
30                 else:
31                     videscounts[v] += 1
32         
33         result = [v[0] for v in sorted(videscounts.items(),key=lambda x:(x[1],x[0]))] 
34         return result

算法思路:BFS + 多条件排序

先使用BFS计算n度人脉,通过visited数组记录已经包含在好友关系中的人,得到n度人脉列表。

再将对列转化成以vidio为key,观看频率为value的字典,然后对字典进行双条件排序,

先按照value从小到大排序,再按照key从小到大排序,最终得到key的列表即为所求。

posted on 2020-01-14 10:37  Sempron2800+  阅读(205)  评论(0编辑  收藏  举报