查找热点数据问题

43 阅读2分钟

问题描述

给你一个整数数组 nums 和一个整数 k,请你用一个字符串返回其中出现频率前 k 高的元素。请按升序排列。 你所设计算法的时间复杂度必须优于 O(nlogn),其中 n 是数组大小。

输入

nums: 一个正整数数组

k: 一个整数

返回

返回一个包含 k 个元素的字符串,数字元素之间用逗号分隔。数字元素按升序排列,表示出现频率最高的 k 个元素。

参数限制

1 <= nums[i] <= 10^4

1 <= nums.length <= 10^5

k 的取值范围是 [1, 数组中不相同的元素的个数]

题目数据保证答案唯一,换句话说,数组中前 k 个高频元素的集合是唯一的

测试样例

样例1:

输入:nums = [1, 1, 1, 2, 2, 3], k = 2

输出:"1,2"

解释:元素 1 出现了 3 次,元素 2 出现了 2 次,元素 3 出现了 1 次。因此前两个高频元素是 1 和 2。

样例2:

输入:nums = [1], k = 1

输出:"1"

样例3:

输入:nums = [4, 4, 4, 2, 2, 2, 3, 3, 1], k = 2

输出:"2,4"

思路:用哈希表记录出每个数字出现的次数,然后从大到小排序,因为题目要求输出字符串,且还需要满足升序输出,所以,先用列表存 储前k个元素,然后再升序排序后遍历一遍转成字符串加给ans,最后输出即可。

代码:

def solution(nums, k):
    # Please write your code here
    dic = {}
    for i in nums:
        dic[i] = dic.get(i, 0)+1
    dic = sorted(dic.items(), key=lambda x: -x[1])
    lst = []
    ans = ''
    for i in range(k):
        lst.append(dic[i][0])
    lst.sort()
    for i in lst:
        ans += str(i) + ','
    ans = ans[:-1]
    return ans

if __name__ == "__main__":
    #  You can add more test cases here
    print(solution( [1,1,1,2,2,3], 2) == "1,2" )
    print(solution( [1], 1) == "1" )