leetcode 347

這個題目雖然不夠新,但是還是需要mark一下,解決了我的一些誤區。這題的想法很簡單,就是需要統計一下數字出現的頻率,然後排個序,輸出前K個,就Ok了。但是要求複雜度小於nlgn。想了半天,覺得一定要排序呀,後來看了discuss才發現,自己忘了bucket sort。一個典型的犧牲空間換時間的算法。主要就是列出一個足夠長的數組,把數字按照頻率放在對應的位置上面。最後再從後向前遍歷一遍,就得到結果了。

此外還有一點需要注意,我在初始化list的時候,用的是list = [[-1000]] * n 這樣的形式,結果發現在對其中一個進行append的時候,其他item也全部都會改變。後來查閱文檔就會發現,它應該是類型與C++指針的形式,每一項的地址都是一樣的,這樣在索引的時候自然都會得到一樣的結果。所以我們需要採用copy這個操作,來開闢一塊新的地址,再進行賦值,這樣才能夠順利完成。附代碼:

class Solution:
    def topKFrequent(self, nums, k):
        """
        :type nums: List[int]
        :type k: int
        :rtype: List[int]
        """
        fre = {}
        for i in range(len(nums)):
            val = nums[i]
            if val in fre:
                fre[val] +=1
            else:
                fre[val] = 1
        bucket = [[-10000]] * (len(nums)+1)
        for key,value in fre.items():
            temp = bucket[value].copy()
            temp.append(key)
            bucket[value] = temp
        result = []
        for i in range(len(bucket)-1,-1,-1):
            for j in bucket[i]:
                if j != -10000:
                    result.append(j)
                    if len(result) >= k:
                        return result
        return result

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章