描述
设计一个简化版的推特(Twitter),可以让用户实现发送推文,关注/取消关注其他用户,能够看见关注人(包括自己)的最近 10 条推文。
实现 Twitter 类:
Twitter() 初始化简易版推特对象
void postTweet(int userId, int tweetId) 根据给定的 tweetId 和 userId 创建一条新推文。每次调用此函数都会使用一个不同的 tweetId 。
List 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 的用户。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/design-twitter
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
分析
参考题解:哈希表 + 链表 + 优先队列(经典多路归并问题)(Java)
- 使用全局变量表示twitter的时间先后
- 使用大顶堆合并多个twitter消息链表
- 用map集合映射用户与关注的用户
- 用map集合映射用户与用户发送的twitter
- 注意很多细节,比如在新加twitter或新关注用户要判空,取消关注也要判集合是否为空
class Twitter {
class twitter{
int tweetId;
int time;
twitter next;
twitter(int tweetId, int time){
this.tweetId = tweetId;
this.time = time;
this.next = null;
}
}
int timeStamp;
Map<Integer,Set<Integer>> following;
Map<Integer,twitter> news;
PriorityQueue<twitter> maxHeap;
public Twitter() {
timeStamp = 0;
following = new HashMap<>();
news = new HashMap<>();
maxHeap = new PriorityQueue<>((a,b)->(b.time - a.time));
}
public void postTweet(int userId, int tweetId) {
timeStamp++;
if(news.containsKey(userId)){
twitter newNews = new twitter(tweetId,timeStamp);
newNews.next = news.get(userId);
news.put(userId,newNews);
}else{
news.put(userId,new twitter(tweetId,timeStamp));
}
}
public List<Integer> getNewsFeed(int userId) {
List<Integer> newsFeed = new ArrayList<>();
maxHeap.clear();
if(news.containsKey(userId)){
maxHeap.offer(news.get(userId));
}
if(following.get(userId) != null){
for(int usr : following.get(userId)){
if(news.containsKey(usr)){
maxHeap.offer(news.get(usr));
}
}
}
while(maxHeap.size() >0 && newsFeed.size() != 10){
twitter t = maxHeap.poll();
newsFeed.add(t.tweetId);
if(t.next != null){
maxHeap.offer(t.next);
}
}
return newsFeed;
}
public void follow(int followerId, int followeeId) {
if(followerId == followeeId){
return ;
}
if(!following.containsKey(followerId)){
following.put(followerId,new HashSet<>());
}
Set<Integer> set = following.get(followerId);
set.add(followeeId);
}
public void unfollow(int followerId, int followeeId) {
Set<Integer> set = following.get(followerId);
if(set == null){
return ;
}
set.remove(followeeId);
}
}
/**
* Your Twitter object will be instantiated and called as such:
* Twitter obj = new Twitter();
* obj.postTweet(userId,tweetId);
* List<Integer> param_2 = obj.getNewsFeed(userId);
* obj.follow(followerId,followeeId);
* obj.unfollow(followerId,followeeId);
*/