hash + 小頂堆
o(nlogk)
from collections import counter
from heapq import
*class
solution
(object):
deftopkfrequent
(self,nums,k)
:map
= counter(nums)
heap =
for num, freq in
map.items():
(freq, num))if
len(heap)
> k:
# 維持k的小頂堆
result =
while heap:1]
)return result[::
-1]# 輸出是正序的,需要倒序
nums =[2
,2,2
,1,1
,4,5
,5,5
,5]# nums = [1,2]
k =2
s = solution(
)print
(s.topkfrequent(nums,k)
)nums =[2
,2,2
,1,1
,4,5
,5,5
,5]# nums = [1,2]
k =2
s = solution(
)print
(s.topkfrequent(nums,k)
)
hash + 桶排序
o(n),用於生成字典
from collections import counter
class
solution
(object):
deftopkfrequent
(self,nums,k)
:# map = {}
# for i in nums:
# map[i] = map.get(i,0) + 1 #生成字典對映
map= counter(nums)
# 建立雜湊表,o(n)
max_freq =
max(
map.values())
bucket =[[
]for _ in
range
(max_freq+1)
]# 用列表推導式建立桶,因為同一頻次可能有多個值
for num, freq in
map.items():
bucket[freq]
res =
for i in
range
(max_freq,0,
-1):
# 取前k頻次
if bucket[i]
: res.extend(bucket[i])if
len(res)
>= k:
return res[
:k]nums =[2
,2,2
,1,1
,4,5
,5,5
,5]# nums = [1,2]
k =2
s = solution(
)print
(s.topkfrequent(nums,k)
)
hash 調包
from collections import counter
class
solution
:def
topkfrequent
(self, nums, k)
:return
[i[0
]for i in counter(nums)
.most_common(k)
]
hash + heap 調包
class
solution
:def
topkfrequent
(self, nums, k)
: count = collections.counter(nums)
return heapq.nlargest(k, count.keys(
), key=count.get)
Leetcode 347 前K個高頻元素
給定乙個非空的整數陣列,返回其 現頻率前k高的元素。示例 1 輸入 nums 1,1,1,2,2,3 k 2 輸出 1,2 示例 2 輸入 nums 1 k 1 輸出 1 說明 首先都要先用hash表統計一次頻率,乙個思路是排序,取前k個元素 第二個思路是使用優先佇列,這裡提供兩種 class so...
Leetcode347 前K個高頻元素
給定乙個非空的整數陣列,返回其 現頻率前 k 高的元素。示例 1 輸入 nums 1,1,1,2,2,3 k 2 輸出 1,2 示例 2 輸入 nums 1 k 1 輸出 1 說明 你可以假設給定的 k 總是合理的,且 1 k 陣列中不相同的元素的個數。你的演算法的時間複雜度必須優於 o n log...
leetcode 347前k個高頻元素
題目 給定乙個非空的整數陣列,返回其 現頻率前 k 高的元素。示例 1 輸入 nums 1,1,1,2,2,3 k 2 輸出 1,2 示例 2 輸入 nums 1 k 1 輸出 1 說明 你可以假設給定的 k 總是合理的,且 1 k 陣列中不相同的元素的個數。你的演算法的時間複雜度必須優於 o n ...