当前位置:网站首页>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);
}
}
};
实现二:哈希表 + 链表 + 优先队列
类似题目
边栏推荐
- CIKM2022 | Sequence Recommendation Based on Bidirectional Transformers Contrastive Learning
- 【640. 求解方程】
- 交换机和生成树知识点
- ASCII、Unicode和UTF-8
- 元宇宙社交应用,靠什么吸引用户「为爱发电」?
- LeetCode Daily 2 Questions 01: Reverse Strings (both 1200) Method: Double Pointer
- 这款可视化工具神器,更直观易用!太爱了
- uni-app微信小程序——下拉多选框
- 水果沙拉酱
- 诺诚健华通过注册:施一公家族身价15亿 高瓴浮亏5亿港元
猜你喜欢
链表中的节点每k个一组翻转
Research on multi-element N-k fault model of power system based on AC power flow (implemented by Matlab code) [Power System Fault]
LeetCode每日两题02:反转字符串中的单词 (均1200道)
虚拟地址空间
What are the concepts, purposes, processes, and testing methods of interface testing?
Leave a message with a prize | OpenBMB x Tsinghua University NLP: The update of the large model open class is complete!
LabVIEW分配多少线程?
H3C S5130 IRF做堆叠
MySQL: MySQL Cluster - Principle and Configuration of Master-Slave Replication
win系统下pytorch深度学习环境安装
随机推荐
MySQL:MySQL的集群——主从复制的原理和配置
STL-stack
LeetCode每日两题01:反转字符串 (均1200道)方法:双指针
计算需要的MIPI lane数目
3598. Binary tree traversal (Huazhong University of Science and Technology exam questions)
How does the Weiluntong touch screen display the current value of abnormal data while alarming?
Qualcomm Platform Development Series Explanation (Application) Introduction to QCMAP Application Framework
Self-organization is a two-way journey between managers and members
LeetCode Daily Question (1573. Number of Ways to Split a String)
TCP连接过程中如果拔掉网线会发生什么?
A shell script the for loop statements, while statement
带着昇腾去旅行:一日看尽金陵城里的AI胜景
高数_复习_第5章:多元函数微分学
y93.第六章 微服务、服务网格及Envoy实战 -- Envoy配置(四)
SDP
Spark基础【RDD转换算子】
Common interview questions for APP UI automation testing, maybe useful~
pytorch手撕CNN
阿里云新增三大高性能计算解决方案,助力生命科学行业快速发展
Redis