【算法题】2456. 最流行的视频创作者

题目:

给你两个字符串数组 creators 和 ids ,和一个整数数组 views ,所有数组的长度都是 n 。平台上第 i 个视频者是 creator[i] ,视频分配的 id 是 ids[i] ,且播放量为 views[i] 。

视频创作者的 流行度 是该创作者的 所有 视频的播放量的 总和 。请找出流行度 最高 创作者以及该创作者播放量 最大 的视频的 id 。

如果存在多个创作者流行度都最高,则需要找出所有符合条件的创作者。
如果某个创作者存在多个播放量最高的视频,则只需要找出字典序最小的 id 。
返回一个二维字符串数组 answer ,其中 answer[i] = [creatori, idi] 表示 creatori 的流行度 最高 且其最流行的视频 id 是 idi ,可以按任何顺序返回该结果。

示例 1:

输入:creators = [“alice”,“bob”,“alice”,“chris”], ids = [“one”,“two”,“three”,“four”], views = [5,10,5,4]
输出:[[“alice”,“one”],[“bob”,“two”]]
解释:
alice 的流行度是 5 + 5 = 10 。
bob 的流行度是 10 。
chris 的流行度是 4 。
alice 和 bob 是流行度最高的创作者。
bob 播放量最高的视频 id 为 “two” 。
alice 播放量最高的视频 id 是 “one” 和 “three” 。由于 “one” 的字典序比 “three” 更小,所以结果中返回的 id 是 “one” 。
示例 2:

输入:creators = [“alice”,“alice”,“alice”], ids = [“a”,“b”,“c”], views = [1,2,2]
输出:[[“alice”,“b”]]
解释:
id 为 “b” 和 “c” 的视频都满足播放量最高的条件。
由于 “b” 的字典序比 “c” 更小,所以结果中返回的 id 是 “b” 。

提示:

n == creators.length == ids.length == views.length
1 <= n <= 10^5
1 <= creators[i].length, ids[i].length <= 5
creators[i] 和 ids[i] 仅由小写英文字母组成
0 <= views[i] <= 10^5

java代码:

class Solution {
    //字典序最小的 id,ids里面不是排序的,不能直接遍历取 要遍历再判断。
    public List<List<String>> mostPopularCreator(String[] creators, String[] ids, int[] views) {
        int n = creators.length;
        //把创作者 和 该创作者的总播放量 当作 K和V 放进HashMap,顺便求个 最大的总播放量
        HashMap<String, Double> nameSumMap = new HashMap<>();
        HashMap<String, Integer> nameMaxViewMap = new HashMap<>();
        HashMap<String, String> nameIdMap = new HashMap<>();
        double maxValue = 0;
        for (int i = 0; i < n; i++) {
            nameSumMap.put(creators[i], nameSumMap.getOrDefault(creators[i],0.0) + views[i]);
            maxValue = Math.max(maxValue, nameSumMap.get(creators[i]));
            //当nameMaxViewMap为空时 或 遍历到更大的播放量的视频时 或 (遍历到播放量都是最大值的视频 且 该视频的id字典序更小时)
            // 把nameMaxViewMap、nameIdMap里该创作者的单个视频的最大播放量和对应的id 更新了 
            // nameIdMap.get(creators[i]).compareTo(ids[i]) > 0 是 前一个的字典序 大于 后一个 
            if (nameMaxViewMap.get(creators[i]) == null
                    || views[i] > nameMaxViewMap.get(creators[i])
                    || (views[i] == nameMaxViewMap.get(creators[i]) && nameIdMap.get(creators[i]).compareTo(ids[i]) > 0)){
                nameMaxViewMap.put(creators[i], views[i]);
                nameIdMap.put(creators[i], ids[i]);
            }
        }
        //根据 最大的总播放量 求出该播放量的创作者们。
        List<List<String>> list = new ArrayList<>();
        for (String i : nameSumMap.keySet()){
            if (nameSumMap.get(i).equals(maxValue)){
                List<String> theOne = new ArrayList<>();
                theOne.add(i);
                theOne.add(nameIdMap.get(i));
                list.add(theOne);
            }
        }

        return list;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值