最流行的视频创作者
难度:
标签:
题目描述
代码结果
运行时间: 101 ms, 内存: 59.6 MB
/*
* 思路:
* 1. 使用流来处理输入数据。
* 2. 使用Collectors.groupingBy收集创作者的数据,统计每个创作者的总播放量和每个创作者的所有视频信息。
* 3. 使用Collectors.maxBy找到播放量最高的创作者。
* 4. 对于每个播放量最高的创作者,找到他们播放量最高的视频的ID(如果有多个,选择字典序最小的一个)。
* 5. 返回结果。
*/
import java.util.*;
import java.util.Map.Entry;
import java.util.stream.*;
public class Solution {
public List<List<String>> mostPopularCreator(String[] creators, String[] ids, int[] views) {
int n = creators.length;
Map<String, List<Video>> creatorVideos = IntStream.range(0, n).mapToObj(i -> new Video(creators[i], ids[i], views[i]))
.collect(Collectors.groupingBy(video -> video.creator));
Map<String, Integer> creatorViews = creatorVideos.entrySet().stream()
.collect(Collectors.toMap(Map.Entry::getKey, entry -> entry.getValue().stream().mapToInt(video -> video.view).sum()));
int maxPopularity = creatorViews.values().stream().max(Integer::compareTo).orElse(0);
return creatorViews.entrySet().stream()
.filter(entry -> entry.getValue() == maxPopularity)
.map(entry -> {
String creator = entry.getKey();
String maxViewId = creatorVideos.get(creator).stream()
.max(Comparator.comparingInt((Video v) -> v.view).thenComparing(v -> v.id)).get().id;
return Arrays.asList(creator, maxViewId);
})
.collect(Collectors.toList());
}
static class Video {
String creator;
String id;
int view;
Video(String creator, String id, int view) {
this.creator = creator;
this.id = id;
this.view = view;
}
}
}
解释
方法:
首先,该解法利用一个字典m来存储每个创作者(video creator)的总播放量、最大播放量和最大播放量对应的视频ID。遍历给定的数组,对于每个视频,更新其创作者在字典中的总播放量,并根据当前视频的播放量和ID更新创作者的最大播放量视频ID。如果当前视频的播放量大于记录的最大播放量,或者播放量相等但视频ID的字典序小于当前记录的ID,就更新记录。接着,我们找到字典中总播放量最大的值,然后从字典中提取出所有总播放量等于这个最大值的创作者和他们的最大播放量视频ID。这样就得到了流行度最高的创作者及其最流行视频的ID。
时间复杂度:
O(n)
空间复杂度:
O(n)
代码细节讲解
🦆
在处理多个最高播放量视频时,如何保证选择的视频ID是字典序最小的?
▷🦆
如果输入数组中存在相同的视频ID但不同播放量,这个算法如何处理这种情况?
▷🦆
为什么在更新字典时选择使用列表来存储创作者的总播放量、最大播放量和最大播放量的视频ID,而不使用其他数据结构如元组或字典?
▷🦆
算法在遍历结束后直接使用最大总播放量来过滤创作者,这种方法是否可能漏掉某些创作者,尤其是在有多个创作者总播放量相同但不是最大值的情况下?
▷