這個題目雖然不夠新,但是還是需要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