力扣题目链接:/
设计一个简化版的推特(Twitter),可以让用户实现发送推文,关注/取消关注其他用户,能够看见关注人(包括自己)的最近 10
条推文。
实现 Twitter
类:
Twitter()
初始化简易版推特对象void postTweet(int userId, int tweetId)
根据给定的 tweetId
和 userId
创建一条新推文。每次调用此函数都会使用一个不同的 tweetId
。List<Integer> getNewsFeed(int userId)
检索当前用户新闻推送中最近 10
条推文的 ID 。新闻推送中的每一项都必须是由用户关注的人或者是用户自己发布的推文。推文必须 按照时间顺序由最近到最远排序 。void follow(int followerId, int followeeId)
ID 为 followerId
的用户开始关注 ID 为 followeeId
的用户。void unfollow(int followerId, int followeeId)
ID 为 followerId
的用户不再关注 ID 为 followeeId
的用户。
示例:
输入 ["Twitter", "postTweet", "getNewsFeed", "follow", "postTweet", "getNewsFeed", "unfollow", "getNewsFeed"] [[], [1, 5], [1], [1, 2], [2, 6], [1], [1, 2], [1]] 输出 [null, null, [5], null, null, [6, 5], null, [5]]解释 Twitter twitter = new Twitter(); twitter.postTweet(1, 5); // 用户 1 发送了一条新推文 (用户 id = 1, 推文 id = 5) NewsFeed(1); // 用户 1 的获取推文应当返回一个列表,其中包含一个 id 为 5 的推文 twitter.follow(1, 2); // 用户 1 关注了用户 2 twitter.postTweet(2, 6); // 用户 2 发送了一个新推文 (推文 id = 6) NewsFeed(1); // 用户 1 的获取推文应当返回一个列表,其中包含两个推文,id 分别为 -> [6, 5] 。推文 id 6 应当在推文 id 5 之前,因为它是在 5 之后发送的 twitter.unfollow(1, 2); // 用户 1 取消关注了用户 2 NewsFeed(1); // 用户 1 获取推文应当返回一个列表,其中包含一个 id 为 5 的推文。因为用户 1 已经不再关注用户 2
提示:
1 <= userId, followerId, followeeId <= 500
0 <= tweetId <= 104
postTweet
、getNewsFeed
、follow
和 unfollow
方法最多调用 3 * 104
次我们使用一下三种数据来记录题目所需各种信息:
unordered_map<int, unordered_set<int>> followList
来记录关注信息。如果followList[1] = {2, 5, 7}
,就说明用户1
关注了用户2
、5
、7
unordered_map<int, vector<pair<int, int>>> posts
来记录发文信息。如果posts[1] = {{1, 2}, {5, 3}, {6, 7}}
,就说明用户1
发了三篇文,文章id分别是1
、5
、3
,这三篇文章的发文时间分别是2
、3
、7
。int th
来记录每次发文的“时间”。那么,对于题目要求的4中操作:
posts[a].push_back({tweedId, th++})
followList[a].insert(b)
followList[a].erase(b)
总体码量不大。
获取10篇推文时,可以优化的是:
typedef pair<int, int> pii; // <twitterId, th>class Twitter {
private:unordered_map<int, unordered_set<int>> followList;unordered_map<int, vector<pii>> posts;int th;
public:Twitter() {th = 0;}void postTweet(int userId, int tweetId) {posts[userId].push_back({tweetId, th++});}vector<int> getNewsFeed(int userId) {if (!followList[userId].count(userId))followList[userId].insert(userId);vector<int> ans;int lastTh = INT_MAX;for (int i = 0; i < 10; i++) {int maxTh = -1;int idOfTheMaxTh;for (int followeeId : followList[userId]) {for (auto[twitterId, twitterTh] : posts[followeeId]) {if (twitterTh >= lastTh)continue;if (twitterTh > maxTh) {maxTh = twitterTh;idOfTheMaxTh = twitterId;}}}if (maxTh == -1)break;lastTh = maxTh;ans.push_back(idOfTheMaxTh);}return ans;}void follow(int followerId, int followeeId) {followList[followerId].insert(followeeId);}void unfollow(int followerId, int followeeId) {followList[followerId].erase(followeeId);}
};
同步发文于CSDN,原创不易,转载请附上原文链接哦~
Tisfy:
本文发布于:2024-01-28 02:10:54,感谢您对本站的认可!
本文链接:https://www.4u4v.net/it/17063790614044.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |