#
# 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
#
# return topK string
# @param strings string字符串一维数组 strings
# @param k int整型 the k
# @return string字符串二维数组
#
class Solution:
def topKstrings(self , strings: List[str], k: int) -> List[List[str]]:
# write code here
map = {}
for string in strings:
map[string] = map.get(string, 0) + 1
string_cnt_list = list(map.items())
def compare(t1, t2):
"""
比较两个元组大小
t1 < t2 : True
"""
if t1[1] < t2[1] or (t1[1] == t2[1] and t1[0] > t2[0]):
return True
else:
return False
def heapify(arr, k, i):
"""
给第i个父节点构建最小堆
"""
l = 2 * i + 1
r = 2 * i + 2
small = i
if l < k and compare(arr[l], arr[small]):
small = l
if r < k and compare(arr[r], arr[small]):
small = r
if small != i:
arr[small], arr[i] = arr[i], arr[small]
heapify(arr, k, small)
def buildMinHeap(arr, k):
"""
为前k个元素构建最小堆
"""
last_parent = (k - 1) // 2
for i in range(last_parent, -1, -1):
heapify(arr, k, i)
def update(arr, t):
"""
更新一个元素,维护最小堆
"""
if compare(arr[0], t):
arr[0] = t
heapify(arr, k, 0)
buildMinHeap(string_cnt_list, k)
for i in range(k, len(string_cnt_list)):
update(string_cnt_list, string_cnt_list[i])
# 对topk排序
for i in range(k-1, 0, -1):
string_cnt_list[0], string_cnt_list[i] = string_cnt_list[i], string_cnt_list[0]
heapify(string_cnt_list, i, 0)
res = [[x[0], x[1]] for x in string_cnt_list[:k]]
return res