哈希表:力扣347. 前 K 个高频元素

1、题目描述:

哈希表:力扣347. 前 K 个高频元素_第1张图片

2、题解:

分治思想–快速排序 | 优先队列:力扣215. 数组中的第K个最大元素
方法1:哈希表 + 数组 + 排序

先把统计数组中元素出现的次数,放在哈希表中,key是数组元素,value是出现次数。
然后放在数组中对数组排序遍历得到频率前k高的元素

Python实现:

class Solution:
    def topKFrequent(self, nums: List[int], k: int) -> List[int]:
        #哈希表 + 数组 + 排序
        hashmap = {}
        n = len(nums)
        for num in nums:
            if num in hashmap:
                hashmap[num] += 1
            else:
                hashmap[num] = 1
        temp = []
        for key,value in hashmap.items():
            temp.append([key,value])
        temp.sort(key = lambda x:-x[1])
        res = []
        for i in range(k):
            res.append(temp[i][0])
        return res

方法2:哈希表 + 翻转

先把统计数组中元素出现的次数,放在哈希表hashmap中,key是数组元素,value是出现次数。
然后设置一个revseremap, key是次数,value是数组元素(注意:与hashmap键值对相反)
对hashmap遍历:(由于可能会出现频次相同的元素,所以reversemap的value是一个数组)
    如果 hashmap的值 在revseremap 中,就添加到revsermap所对应的数组后面
    否则,就让reversemap的key值等于[hashmap的key值]
然后从nums的长度,开始倒着遍历:
    如果i在revseremap中
        循环把出现次数相同的元素加入到结果数组res中
        如果res的长度为k,则返回res
class Solution:
    def topKFrequent(self, nums: List[int], k: int) -> List[int]:
        #哈希表 + 翻转
        hashmap = {}
        n = len(nums)
        for num in nums:
            if num in hashmap:
                hashmap[num] += 1
            else:
                hashmap[num] = 1
        reversemap = {}
        for key, value in hashmap.items():
            if value in reversemap:
                reversemap[value].append(key)
            else:
                reversemap[value] = [key] 
        res = []
        for i in range(n,0,-1):
            if i in reversemap:
                for j in reversemap[i]:
                    res.append(j)
                    if len(res) == k:
                        return res

3、复杂度分析:

方法1:
时间复杂度:O(NlogN)
空间复杂度:O(N)
方法2:
时间复杂度:O(N)
空间复杂度:O(N)

你可能感兴趣的:(LeetCode高频面试题)