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)