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的列表即为所求。