forked from szl0072/Leetcode-Solution-Code
-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathDesignTwitter.java
117 lines (100 loc) · 3.08 KB
/
DesignTwitter.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
package leetcode;
import java.util.*;
/**
* Project Name : Leetcode
* Package Name : leetcode
* File Name : DesignTwitter
* Creator : Edward
* Date : Jan, 2018
* Description : 355. Design Twitter
*/
public class DesignTwitter {
private int timeStamp = 0;
private HashMap<Integer, User> userMap;
class Tweet {
public int id;
public int time;
public Tweet next;
public Tweet(int id) {
this.id = id;
time = timeStamp++;
next = null;
}
}
class User {
public int id;
public HashSet<Integer> followed;
public Tweet tweetHead;
public User(int id) {
this.id = id;
followed = new HashSet<>();
follow(id);
tweetHead = null;
}
public void follow(int id) {
followed.add(id);
}
public void unFollow(int id) {
followed.remove(id);
}
public void post(int id) {
Tweet tweet = new Tweet(id);
tweet.next = tweetHead;
tweetHead = tweet;
}
}
/** Initialize your data structure here. */
public DesignTwitter() {
userMap = new HashMap<>();
}
public void postTweet(int userId, int tweetId) {
if (!userMap.containsKey(userId)) {
User user = new User(userId);
userMap.put(userId, user);
}
userMap.get(userId).post(tweetId);
}
/** Retrieve the 10 most recent tweet ids in the user's news feed.
* Each item in the news feed must be posted by users who the user followed or by the user herself.
* Tweets must be ordered from most recent to least recent.
* */
public List<Integer> getNewsFeed(int userId) {
List<Integer> res = new LinkedList<>();
if (!userMap.containsKey(userId)) return res;
HashSet<Integer> users = userMap.get(userId).followed;
PriorityQueue<Tweet> pq = new PriorityQueue<>(users.size(), (a, b) -> (b.time - a.time));
for (int user : users) {
Tweet tweet = userMap.get(user).tweetHead;
if (tweet != null) {
pq.offer(tweet);
}
}
int count = 0;
while (!pq.isEmpty() && count < 10) {
Tweet tweet = pq.poll();
res.add(tweet.id);
count++;
if (tweet.next != null) {
pq.offer(tweet.next);
}
}
return res;
}
public void follow(int followerId, int followeeId) {
if (!userMap.containsKey(followerId)) {
User user = new User(followerId);
userMap.put(followerId, user);
}
if (!userMap.containsKey(followeeId)) {
User user = new User(followeeId);
userMap.put(followeeId, user);
}
userMap.get(followerId).follow(followeeId);
}
public void unfollow(int followerId, int followeeId) {
if (!userMap.containsKey(followerId) || followerId == followeeId) {
return;
}
userMap.get(followerId).unFollow(followeeId);
}
}