有 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
思路:BFS和DFS都可以,比赛中我用的BFS,没有坑点,比较low
class Solution {
class node{
int x,y;
public node(int x,int y) {
this.x=x;
this.y=y;
}
}
public List<String> watchedVideosByFriends(List<List<String>> watchedVideos, int[][] friends, int id, int level) {
boolean[] flag=new boolean[watchedVideos.size()];
List<String> ans=new ArrayList<>();
Queue<node> q=new LinkedList<>();
Map<String,Integer> map=new HashMap<>();
flag[id]=true;
q.add(new node(id,0));
while(!q.isEmpty()) {
node now=q.poll();
if(now.y==level) {
for(int i=0;i<watchedVideos.get(now.x).size();i++) {
if(!map.containsKey(watchedVideos.get(now.x).get(i)))
ans.add(watchedVideos.get(now.x).get(i));
map.put(watchedVideos.get(now.x).get(i),
map.getOrDefault(watchedVideos.get(now.x).get(i), 0)+1);
}
continue;
}
for(int i=0;i<friends[now.x].length;i++) {
if(flag[friends[now.x][i]]) continue;
flag[friends[now.x][i]]=true;
q.add(new node(friends[now.x][i],now.y+1));
}
}
String[] res=new String[ans.size()];
for(int i=0;i<ans.size();i++) {
res[i]=ans.get(i);
//System.out.println(map.get(ans.get(i)));
}
//System.out.println(ans);
for(int i=0;i<res.length;i++)
for(int j=0;j<i;j++)
if(map.get(res[i])<map.get(res[j]) ||
map.get(res[i])==map.get(res[j]) && res[j].compareTo(res[i])>0)
{
String tmp=res[i];
res[i]=res[j];
res[j]=tmp;
}
ans.clear();
for(int i=0;i<res.length;i++) ans.add(res[i]);
return ans;
}
}