LeetCode第170场周赛:5305. 获取你好友已观看的视频(BFS)

有 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;
    }
}

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值