Bruteforce Solution
class TweetCounts:
def __init__(self):
self.user = collections.defaultdict(list)
def recordTweet(self, tweetName: str, time: int) -> None:
self.user[tweetName].append(time)
def getTweetCountsPerFrequency(self, freq: str, tweetName: str, startTime: int, endTime: int) -> List[int]:
#endTime += 1
if freq == 'minute':
intv = 60
elif freq == 'hour':
intv = 60 * 60
else:
intv = 60 * 60 * 24
res = [0] * ((endTime - startTime )// intv +1)
for t in self.user[tweetName]:
#if startTime <= t < endTime:
if startTime <= t <= endTime:
res[(t-startTime) // intv] += 1
return res
# Your TweetCounts object will be instantiated and called as such:
# obj = TweetCounts()
# obj.recordTweet(tweetName,time)
# param_2 = obj.getTweetCountsPerFrequency(freq,tweetName,startTime,endTime)
Balanced Tree Solution
from sortedcontainers import SortedList #SortedDict
class TweetCounts:
def __init__(self):
#self.user = collections.defaultdict(SortedDict)
self.user = collections.defaultdict(SortedList)
def recordTweet(self, tweetName: str, time: int) -> None:
""" time O(N*lgN)
"""
# if time not in self.user[tweetName]:
# self.user[tweetName][time] = 0
# self.user[tweetName][time] += 1
self.user[tweetName].add(time) # O(lgN)
def getTweetCountsPerFrequency(self, freq: str, tweetName: str, startTime: int, endTime: int) -> List[int]:
""" time O(lgN + K) K: diff of startTime, endTime, N: length of inserted/recorded items
"""
tw = self.user[tweetName]
if freq == 'minute':
intv = 60
elif freq == 'hour':
intv = 60 * 60
else:
intv = 60 * 60 * 24
res = [0] * (((endTime - startTime)//intv) +1)
fst_idx = tw.bisect_left(startTime) # lgN
snd_idx = tw.bisect_right(endTime)
# for t in tw.irange(startTime,endTime):
# ind = (t-startTime) // intv
# res[ind] += tw[t]
# return res
for idx in range(fst_idx,snd_idx):
t = tw[idx]
res[(t-startTime)//intv] += 1
return res
# Your TweetCounts object will be instantiated and called as such:
# obj = TweetCounts()
# obj.recordTweet(tweetName,time)
# param_2 = obj.getTweetCountsPerFrequency(freq,tweetName,startTime,endTime)