lc第317场周赛question2-最流行的视频创作者
给你两个字符串数组 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" 。
思路:手搓数据结构配合stl暴力ac,用结构体存下每个人的字典序最小的最高分作品与所有作品的分数和.
然后所有节点按分数大小入大根堆,与堆顶节点分数相同的节点都是答案
class Solution { struct node1{ string name = ""; //存下人名 string id = "";//存下字典最小的最大分数作品 int maxa = -1;//记录一个人作品中的最大分数 int s = 0;//一个人作品的分数和 bool friend operator < (node1 a,node1 b)//大根堆 { return a.s<b.s; } }; map<string,node1> m;//通过人名快速定位节点 priority_queue<node1> q; vector<vector<string>> ans; vector<string> temp; public: vector<vector<string>> mostPopularCreator(vector<string>& creators, vector<string>& ids, vector<int>& views) { for(int i = 0;i<creators.size();i++) { if(m.count(creators[i])==0){ node1 temp; temp.name = creators[i]; if(views[i]>temp.maxa)//更新最优作品 { temp.id = ids[i]; temp.maxa = views[i]; } else if(views[i]==temp.maxa) { if(ids[i]<temp.id) temp.id = ids[i]; } temp.s+=views[i]; m[creators[i]] = temp; } else{ if(views[i]>m[creators[i]].maxa) { m[creators[i]].id = ids[i]; m[creators[i]].maxa = views[i]; } else if(views[i] == m[creators[i]].maxa) { if(ids[i]<m[creators[i]].id) m[creators[i]].id = ids[i]; } m[creators[i]].s+=views[i]; } } for(auto i = m.begin();i!=m.end();i++)//所有结点入堆 { q.push(i->second); } int flag = -1; while(!q.empty())//原始堆顶一定是解,但是新堆顶也有可能是,需要用flag记录一下 { if(flag==-1){ temp.push_back(q.top().name); temp.push_back(q.top().id); flag = q.top().s; ans.push_back(temp); temp.clear(); q.pop(); } else if(q.top().s==flag){ temp.push_back(q.top().name); temp.push_back(q.top().id); ans.push_back(temp); temp.clear(); q.pop(); } else break; } return ans; } };