---
tags: leetcode
---
# [355. Design Twitter](https://leetcode.com/problems/design-twitter/)
---
# My Solution
## The Key Idea for Solving This Coding Question
## C++ Code
```cpp=
struct postData {
int postId;
int timestamp;
postData(int postId, int timestamp) : postId(postId), timestamp(timestamp) {}
};
class cmp {
public:
bool operator() (postData &p1, postData &p2) {
return p1.timestamp < p2.timestamp;
}
};
class Twitter {
public:
Twitter() : timestamp(0) {
}
void postTweet(int userId, int tweetId) {
userToPosts[userId].push_back(postData(tweetId, timestamp));
++timestamp;
}
vector<int> getNewsFeed(int userId) {
priority_queue<postData, vector<postData>, cmp> allPosts;
auto userIter = userToPosts.find(userId);
if (userIter != userToPosts.end() && !userIter->second.empty()) {
vector<postData> &userPosts = userIter->second;
for (auto &post : userPosts) {
allPosts.push(post);
}
}
auto followeeIter = userToFollowees.find(userId);
if (followeeIter != userToFollowees.end() && !followeeIter->second.empty()) {
unordered_set<int> &followees = followeeIter->second;
for (auto &followeeId : followees) {
auto followeeIter = userToPosts.find(followeeId);
if (followeeIter == userToPosts.end()) {
continue;
}
vector<postData> &followeePosts = followeeIter->second;
for (auto &post : followeePosts) {
allPosts.push(post);
}
}
}
vector<int> mostRecentPost;
int postCnt = 10;
while (postCnt > 0 && !allPosts.empty()) {
mostRecentPost.push_back(allPosts.top().postId);
allPosts.pop();
--postCnt;
}
return mostRecentPost;
}
void follow(int followerId, int followeeId) {
userToFollowees[followerId].insert(followeeId);
}
void unfollow(int followerId, int followeeId) {
userToFollowees[followerId].erase(followeeId);
}
private:
unordered_map<int, vector<postData>> userToPosts;
unordered_map<int, unordered_set<int>> userToFollowees;
int timestamp;
};
/**
* Your Twitter object will be instantiated and called as such:
* Twitter* obj = new Twitter();
* obj->postTweet(userId,tweetId);
* vector<int> param_2 = obj->getNewsFeed(userId);
* obj->follow(followerId,followeeId);
* obj->unfollow(followerId,followeeId);
*/
```
## Time Complexity
* `Twitter`
$O(1)$
* `postTweet`
$O(1)$
* `getNewsFeed`
$O(n)$
$n$ is the total number of posts at the moment when `getNewsFeed` is called.
* `follow`
$O(1)$
* `unfollow`
$O(1)$
## Space Complexity
* `Twitter`
$O(1)$
* `postTweet`
$O(1)$
* `getNewsFeed`
$O(n)$
$n$ is the total number of posts at the moment when `getNewsFeed` is called.
* `follow`
$O(1)$
* `unfollow`
$O(1)$
# Miscellaneous
<!--
# Test Cases
```
["Twitter","postTweet","getNewsFeed","follow","postTweet","getNewsFeed","unfollow","getNewsFeed"]
[[],[1,5],[1],[1,2],[2,6],[1],[1,2],[1]]
```
* Wrong Answer
```
["Twitter","postTweet","postTweet","getNewsFeed"]
[[],[1,5],[1,3],[1]]
```
* Wrong Answer
```
["Twitter","postTweet","getNewsFeed","follow","getNewsFeed","unfollow","getNewsFeed"]
[[],[1,1],[1],[2,1],[2],[2,1],[2]]
```
* Runtime Error
```
["Twitter","follow","getNewsFeed"]
[[],[1,5],[1]]
```
-->