Leetcode 1348:プッシュメッセージ数(超詳細なソリューション!!!)

あなたは、つぶやきカウントクラスに次の2つの方法の実現をサポートすることができますTweetCounts

1。recordTweet(string tweetName, int time)

  • ツイートの記録を掲載:ユーザーtweetNametime(で単位)は、時間のツイートを投稿しました。

2。getTweetCountsPerFrequency(string freq, string tweetName, int startTime, int endTime)

  • リターン開始時刻からstartTime(まで時間の終わりに単位)endTime(内秒の各内のユニット)のサブ * 、* * *時間一日の日* *(に応じてfreq、ユーザが指定した)tweetNameツイートの総数が投稿しました。
  • freq値は常にされて分割 * 、* とき 時間または一日 一日 1、指定したユーザー取得しtweetNameた時間間隔の数つぶやきを。
  • 第1の時間間隔から常にあるstartTime時間間隔ので、初め[startTime, startTime + delta*1>, [startTime + delta*1, startTime + delta*2>, [startTime + delta*2, startTime + delta*3>, ... , [startTime + delta*i, **min**(startTime + delta*(i+1), endTime + 1)>ものでiあり、delta(に応じてfreq非負の整数です)。

例:

输入:
["TweetCounts","recordTweet","recordTweet","recordTweet","getTweetCountsPerFrequency","getTweetCountsPerFrequency","recordTweet","getTweetCountsPerFrequency"]
[[],["tweet3",0],["tweet3",60],["tweet3",10],["minute","tweet3",0,59],["minute","tweet3",0,60],["tweet3",120],["hour","tweet3",0,210]]

输出:
[null,null,null,null,[2],[2,1],null,[4]]

解释:
TweetCounts tweetCounts = new TweetCounts();
tweetCounts.recordTweet("tweet3", 0);
tweetCounts.recordTweet("tweet3", 60);
tweetCounts.recordTweet("tweet3", 10);                             // "tweet3" 发布推文的时间分别是 0, 10 和 60 。
tweetCounts.getTweetCountsPerFrequency("minute", "tweet3", 0, 59); // 返回 [2]。统计频率是每分钟(60 秒),因此只有一个有效时间间隔 [0,60> - > 2 条推文。
tweetCounts.getTweetCountsPerFrequency("minute", "tweet3", 0, 60); // 返回 [2,1]。统计频率是每分钟(60 秒),因此有两个有效时间间隔 1) [0,60> - > 2 条推文,和 2) [60,61> - > 1 条推文。 
tweetCounts.recordTweet("tweet3", 120);                            // "tweet3" 发布推文的时间分别是 0, 10, 60 和 120 。
tweetCounts.getTweetCountsPerFrequency("hour", "tweet3", 0, 210);  // 返回 [4]。统计频率是每小时(3600 秒),因此只有一个有效时间间隔 [0,211> - > 4 条推文。

ヒント:

  • 考慮に入れるrecordTweetgetTweetCountsPerFrequency、最大で、10000運営。
  • 0 <= time, startTime, endTime <= 10^9
  • 0 <= endTime - startTime <= 10^4

問題解決のためのアイデア

タイトルは比較的長いが、比較的簡単を通じて、動作するようにmapレコードの配列、およびデータ挿入ソートまたはソートされていないことができたときに(ないソートの前で、それはソートする必要がある場合)の半分で、クエリ時間を選択しました。

class TweetCounts:

    def __init__(self):
        self.tweets = collections.defaultdict(list)
        

    def recordTweet(self, tweetName: str, time: int) -> None:
        bisect.insort_left(self.tweets[tweetName], time)
        

    def getTweetCountsPerFrequency(self, freq: str, tweetName: str, startTime: int, endTime: int) -> List[int]:
        delta = 1
        if freq == 'minute':
            delta = 60
        elif freq == 'hour':
            delta = 60 * 60
        elif freq == 'day':
            delta = 60 * 60 * 24
        
        res = [0] * ((endTime - startTime) // delta + 1)
        
        pos = bisect.bisect_left(self.tweets[tweetName], startTime)
        while pos < len(self.tweets[tweetName]) and self.tweets[tweetName][pos] <= endTime:
            res[(self.tweets[tweetName][pos] - startTime) // delta] += 1
            pos += 1
        return res

私は私に追加の質問の他の言語バージョンGitHubのLeetcode

ご質問がある場合は、私が指摘したいです!

公開された731元の記事 ウォンの賞賛457 ビュー830 000 +

おすすめ

転載: blog.csdn.net/qq_17550379/article/details/104258970