有 n 个人,每个人都有一个 0 到 n-1 的唯一 id 。
给你数组 watchedVideos 和 friends ,其中 watchedVideos[i] 和 friends[i] 分别表示 id = i 的人观看过的视频列表和他的好友列表。
Level 1 的视频包含所有你好友观看过的视频,level 2 的视频包含所有你好友的好友观看过的视频,以此类推。一般的,Level 为 k 的视频包含所有从你出发,最短距离为 k 的好友观看过的视频。
给定你的 id 和一个 level 值,请你找出所有指定 level 的视频,并将它们按观看频率升序返回。如果有频率相同的视频,请将它们按名字字典序从小到大排列。
示例 1:
输入:watchedVideos = [["A","B"],["C"],["B","C"],["D"]], friends = [[1,2],[0,3],[0,3],[1,2]], id = 0, level = 1
输出:["B","C"]
解释:
你的 id 为 0 ,你的朋友包括:
id 为 1 -> watchedVideos = ["C"]
id 为 2 -> watchedVideos = ["B","C"]
你朋友观看过视频的频率为:
B -> 1
C -> 2
示例 2:
输入:watchedVideos = [["A","B"],["C"],["B","C"],["D"]], friends = [[1,2],[0,3],[0,3],[1,2]], id = 0, level = 2
输出:["D"]
解释:
你的 id 为 0 ,你朋友的朋友只有一个人,他的 id 为 3 。
提示:
n == watchedVideos.length == friends.length
2 <= n <= 100
1 <= watchedVideos[i].length <= 100
1 <= watchedVideos[i][j].length <= 8
0 <= friends[i].length < n
0 <= friends[i][j] < n
0 <= id < n
1 <= level < n
如果 friends[i] 包含 j ,那么 friends[j] 包含 i
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/get-watched-videos-by-your-friends
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
思路:
这个问题可以通过三步解决,
1. 找到所有 k-level 的朋友,类似二叉树层序遍历找第k层的元素,可以用BFS解决
2. 把第一步找出来的朋友看过的视频拿出来,直接读watchedVideos这个输入即可
3. 按照题目要求排序
时间复杂度:O(N + MN + MNlogMN),N是总人数,M是watchedVideos最长元素的长度
空间复杂度:O(N + MN)
class Solution(object):
def watchedVideosByFriends(self, watchedVideos, friends, idd, level):
"""
:type watchedVideos: List[List[str]]
:type friends: List[List[int]]
:type id: int
:type level: int
:rtype: List[str]
"""
from collections import deque,defaultdict
# 1. find all k-level friends by BFS
queue = deque([idd])
visited = set([idd])
for l in range(level):
friendset = set()
for _ in range(len(queue)):
cur = queue.popleft()
for fri in friends[cur]:
if fri not in visited:
visited.add(fri)
queue.append(fri)
# 2. find watched videos of all k-level friends
videos = defaultdict(int)
for friend in queue:
for video in watchedVideos[friend]:
videos[video] += 1
# 3. count the frequency
res = [[key, val] for key, val in videos.items()]
res = sorted(res, key = lambda x:(x[1], x[0]))
return [x[0] for x in res]