三、获取你好友已观看的视频(Weekly Contest 170)

题目描述:
有 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());
        }
    }

}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值