leetcode 355 设计推特

用链表存储用户发送的每一个推特,用堆获取最先的10条动态

java 复制代码
class Twitter {
    Map<Integer,Set<Integer>> followMap;
    //规定最新的放到最后
    Map<Integer,Tweet> postMap;
    //优先队列(堆)
    PriorityQueue<Tweet> priorityQueue;
    int timeStamp = 0;
    int limit = 10;
    public Twitter() {
        followMap = new HashMap();
        postMap = new HashMap<>();
        //按照每一个推特发送的时间戳由大到小排布
        priorityQueue = new PriorityQueue<>((t1,t2) -> t2.timeStamp - t1.timeStamp);
    }
    //userId发送推特
    public void postTweet(int userId, int tweetId) {
        //首先根据postMap来获取userId对应发送到文章
        Tweet tweet = postMap.get(userId);
        //生成新的tweet
        Tweet newTweet = new Tweet(tweetId, timeStamp++, tweet);
        postMap.put(userId,newTweet);
    }
    //根据userId获得自己和关注用户的10条推特,按时间顺序由近到远排序
    public List<Integer> getNewsFeed(int userId) {
        //因为每一个用户都有自己的优先队列,所以先清空优先队列
        priorityQueue.clear();
        //将自己和关注的用户发送的最新的推特id先放入到优先队列
        if (postMap.containsKey(userId))
            priorityQueue.offer(postMap.get(userId));
        Set<Integer> follows = followMap.get(userId);
        if (follows != null){
            for (Integer follow : follows) {
                 if (postMap.containsKey(follow))
                priorityQueue.offer(postMap.get(follow));
            }
        }
        //现在用户和所有关注的推特都已经放入到优先队列,开始获取前10条
        int count = 0;
        ArrayList<Integer> result = new ArrayList<>();
        while (!priorityQueue.isEmpty() && count < limit){
            //获取头部,在优先队列中删除
            Tweet tweet = priorityQueue.poll();
            result.add(tweet.id);
            if (tweet.next != null)
                priorityQueue.offer(tweet.next);
            count++;
        }
        return result;
    }
    //关注
    public void follow(int followerId, int followeeId) {
        // 被关注人不能是自己
        if (followeeId == followerId) {
            return;
        }
        
        Set<Integer> follows = followMap.getOrDefault(followerId, new HashSet<>());
        follows.add(followeeId);
        followMap.put(followerId,follows);
    }
    //取关
    public void unfollow(int followerId, int followeeId) {
        // 被关注人不能是自己
        if (followeeId == followerId) {
            return;
        }
        Set<Integer> follows = followMap.getOrDefault(followerId, new HashSet<>());
        follows.remove(followeeId);
        followMap.put(followerId,follows);
    }
}
class Tweet{
    int id;
    int timeStamp;
    Tweet next;

    public Tweet(int id, int timeStamp) {
        this.id = id;
        this.timeStamp = timeStamp;
    }

    public Tweet(int id, int timeStamp, Tweet next) {
        this.id = id;
        this.timeStamp = timeStamp;
        this.next = next;
    }
}

/**
 * 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);
 */
相关推荐
leisoo80971 小时前
财报数据怎么排雷本地化Python构建财务异常预警系统
人工智能·python·算法
luj_17683 小时前
塔防牌:策略与卡牌的智慧碰撞
服务器·c语言·开发语言·经验分享·算法
郝学胜-神的一滴3 小时前
干货版《算法导论》17:二叉树核心原理、遍历逻辑与高阶实操全解
数据结构·c++·python·算法·计算机·编程
爱编程的小新☆4 小时前
【LeetCode】从递归到 Flood Fill:5 道题吃透 DFS 的选择、回溯与标记
java·算法·leetcode·深度优先·回溯·flood fill
Water_Sunzhipeng4 小时前
2024牛客暑期多校训练营1
算法
hetao17338374 小时前
2026-08-09~08-14 hetao1733837 的刷题记录
c++·算法
技术小黑4 小时前
RNN算法实战系列06 | LSTM 实现糖尿病探索与预测
rnn·算法·lstm
evans在进步4 小时前
LeetCode 33:搜索旋转排序数组——Java 两阶段二分查找详解
java·python·leetcode
疯狂打码的少年4 小时前
【数据结构】二叉树的性质(五大性质+计算)
数据结构·笔记·算法
wabs6665 小时前
关于图论【A*算法 | 卡码网127.骑士的攻击的思考】
数据结构·算法·图论·卡码网·广搜的改进版