当前位置:网站首页>leetcode:355. 设计推特
leetcode:355. 设计推特
2022-08-10 22:17:00 【OceanStar的学习笔记】
题目来源
题目描述

class Twitter {
public:
Twitter() {
}
void postTweet(int userId, int tweetId) {
}
vector<int> getNewsFeed(int userId) {
}
void follow(int followerId, int followeeId) {
}
void unfollow(int followerId, int followeeId) {
}
};
题目解析
实现一
思路
- 道题的主要难点在于实现 getNewsFeed() 函数,这个函数获取自己和好友的最近 10 条消息
- 需要两个映射:
- 映射:key = userId, value为当前用户关注的其他所有用户的ID的集合
- 这里只需要保证加入的用户ID唯一就可以了,可以用unordered_set来做
- 映射:key = userId, value为当前用户发送的所有博文
- 要想获得最近的消息,我们需要知道博文的时间发送先后顺序
- 因为tweetId不确定是不是自增的,所以我们定义一个cnt来模拟时间点,每发送一个消息,time就自增1,就知道哪个博文是先发的了
- 怎么将tweetId和cnt绑定起来呢?
- 我们可以定义一个结构体,也可以定义一个map(因为是一对一的),其key为time,value为对应tweetId。
- 为什么要key为time呢?
- 这样就会先根据time排序,如果time相等,就会根据tweetid排序
- 映射:key = userId, value为当前用户关注的其他所有用户的ID的集合
- 如何获取最近的10条消息呢?
- 维护一个大小为10的哈希表
- 然后遍历自己的好友,以及好友的所有消息(注意,先自己关注自己)
- 如果新遍历到的消息比map中最早的消息要晚,那么将这个消息加入,然后删除最早的那个消息(这里需要有序,所以用map而不是unordered_map)
class Twitter {
public:
Twitter() {
time = 0;
}
void postTweet(int userId, int tweetId) {
follow(userId, userId);
tweets[userId].insert({
time++, tweetId});
}
vector<int> getNewsFeed(int userId) {
vector<int> res;
map<int, int> top10;
for (auto id : friends[userId]) {
for (auto a : tweets[id]) {
top10.insert({
a.first, a.second});
if (top10.size() > 10) top10.erase(top10.begin());
}
}
for (auto a : top10) {
res.insert(res.begin(), a.second);
}
return res;
}
void follow(int followerId, int followeeId) {
friends[followerId].insert(followeeId);
}
void unfollow(int followerId, int followeeId) {
if (followerId != followeeId) {
friends[followerId].erase(followeeId);
}
}
private:
int time;
unordered_map<int, unordered_set<int>> friends;
unordered_map<int, map<int, int>> tweets;
};
下面这种方法和上面的基本一样,就是在保存用户所有消息的时候,用的是 vector<pair<int, int>>,这样可以用 priority_queue 来帮助找出最新 10 条消息
class Twitter {
int time;
std::unordered_map<int, std::unordered_set<int>> friends;
std::unordered_map<int, std::vector<std::pair<int, int>>> tweets;
public:
Twitter() {
time = 0;
}
void postTweet(int userId, int tweetId) {
follow(userId, userId);
tweets[userId].push_back({
++time, tweetId});
}
vector<int> getNewsFeed(int userId) {
std::priority_queue<std::pair<int, int>, std::vector<std::pair<int, int>>, std::greater<>> minPQ;
for(auto id : friends[userId]){
for(auto a : tweets[id]){
minPQ.push(a);
if (minPQ.size() > 10) minPQ.pop();
}
}
std::vector<int> vec;
while (!minPQ.empty()){
vec.insert(vec.begin(), minPQ.top().second);
minPQ.pop();
}
return vec;
}
void follow(int followerId, int followeeId) {
friends[followerId].insert(followeeId);
}
void unfollow(int followerId, int followeeId) {
if(followeeId != followerId){
friends[followerId].erase(followeeId);
}
}
};
实现二:哈希表 + 链表 + 优先队列

类似题目
边栏推荐
- QT笔记——vs + qt 创建一个带界面的 dll 和 调用带界面的dll
- 阿里云新增三大高性能计算解决方案,助力生命科学行业快速发展
- An article to teach you a quick start and basic explanation of Pytest, be sure to read
- make & cmake
- ASCII、Unicode和UTF-8
- STL-stack
- CIKM2022 | Sequence Recommendation Based on Bidirectional Transformers Contrastive Learning
- 配电网络扩展规划:考虑使用概率性能源生产和消费概况的决策(Matlab代码实现)
- B站数据分析岗实习生面试记录
- Translating scientific and technological papers, how to translate from Russian to Chinese
猜你喜欢

mmpose关键点(一):评价指标(PCK,OKS,mAP)

Why general company will say "go back messages such as" after the end of the interview, rather than just tell the interviewer the result?

BM7 链表中环的入口结点

威纶通触摸屏如何在报警的同时,显示出异常数据的当前值?

QT笔记——用VS + qt 生成dll 和 调用生成的dll

August 10, 2022: Building Web Applications for Beginners with ASP.NET Core -- Creating Web UIs with ASP.NET Core

LeetCode Daily 2 Questions 02: Reverse the words in a string (1200 each)

Translating scientific and technological papers, how to translate from Russian to Chinese

QT笔记——QT工具uic,rcc,moc,qmake的使用和介绍

String类的常用方法
随机推荐
电力系统潮流计算(牛顿-拉夫逊法、高斯-赛德尔法、快速解耦法)(Matlab代码实现)
CFdiv2-Beautiful Mirrors-(期望)
水果沙拉酱
web项目访问引用jar内部的静态资源
美味的佳肴
【640. Solving Equations】
字节跳动原来这么容易就能进去...
MySQL Advanced Commands
服务——DHCP原理与配置
留言有奖|OpenBMB x 清华大学NLP:大模型公开课更新完结!
ArcGIS应用基础知识
商家招募电商主播要考虑哪些内容
"DevOps Night Talk" - Pilot - Introduction to CNCF Open Source DevOps Project DevStream - feat. PMC member Hu Tao
文件IO-缓冲区
2022年8月10日:使用 ASP.NET Core 为初学者构建 Web 应用程序--使用 ASP.NET Core 创建 Web UI(没看懂需要再看一遍)
Why general company will say "go back messages such as" after the end of the interview, rather than just tell the interviewer the result?
String类的常用方法
uni-app微信小程序——下拉多选框
[Maui official version] Create a cross-platform Maui program, as well as the implementation and demonstration of dependency injection and MVVM two-way binding
QT笔记——QT工具uic,rcc,moc,qmake的使用和介绍