题目描述:
有 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
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
使用bfs即可:注意的是最近关系的朋友应该首先被移除,实现了Comparable接口是为了后面的排序方便
class Move implements Comparable<Move>{
int time;
String name;
public Move(int time, String name) {
this.time = time;
this.name = name;
}
@Override
public int compareTo(Move o) {
if(o.time != time){
return time - o.time;
}
return -o.name.compareTo(name);
}
}
class Solution {
public List<String> watchedVideosByFriends(List<List<String>> watchedVideos, int[][] friends, int id, int level) {
HashSet<Integer> set = new HashSet<>();
boolean visited[] = new boolean[friends.length];
visited[id] = true;
bfs(id,level,friends,new LinkedList<>(),visited,set);
Map<String,Integer> map = new HashMap<>();
for (Integer integer : set) {
List<String> list = watchedVideos.get(integer);
for (String s : list) {
map.put(s,map.getOrDefault(s,0) + 1);
}
}
List<Move> list = new ArrayList<>();
for (Map.Entry<String, Integer> move : map.entrySet()) {
String key = move.getKey();
int value = move.getValue();
Move move1 = new Move(value, key);
list.add(move1);
}
Collections.sort(list);
StringBuilder stringBuilder = new StringBuilder();
List<String> list1 = new ArrayList<>();
for (Move move : list) {
list1.add(move.name);
}
return list1;
// return null;
}
public void bfs(int curfriend,int level,int [][] friends,Queue<Integer> queue,boolean [] visited,Set<Integer> set){
int index = 0;
queue.offer(curfriend);
visited[curfriend] = true;
while (index ++ < level){
int size = queue.size();
for (int i = 0; i < size; i++) {
int top = queue.poll();
int ds[] = friends[top];
for (int d : ds) {
if(!visited[d]){
queue.offer(d);
visited[d] = true;
}
}
}
}
while (!queue.isEmpty()){
set.add(queue.poll());
}
}
}