leetcode347 前 K 個高頻元素

2021-10-06 06:33:38 字數 2209 閱讀 9942

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 ...