Day 13| 239. 滑动窗口最大值、 347.前 K 个高频元素

239. 滑动窗口最大值 (一刷至少需要理解思路)

之前讲的都是栈的应用,这次该是队列的应用了。

本题算比较有难度的,需要自己去构造单调队列,建议先看视频来理解。

题目链接/文章讲解/视频讲解:https://programmercarl.com/0239.滑动窗口最大值.html

思考

用单调队列实现,太难了,超过能力范围了,跳过。

347.前 K 个高频元素 (一刷至少需要理解思路)

大/小顶堆的应用, 在C++中就是优先级队列

本题是 大数据中取前k值 的经典思路,了解想法之后,不算难。

题目链接/文章讲解/视频讲解:https://programmercarl.com/0347.前K个高频元素.html

思考

  1. 哈希+内置排序
class Solution:
    def topKFrequent(self, nums: List[int], k: int) -> List[int]:
        num_dict = defaultdict(int)
        for c in nums:
            num_dict[c]+=1
        index_dict = defaultdict(list)
        for key in num_dict:
            index_dict[num_dict[key]].append(key)
        keys = list(index_dict.keys())
        keys.sort(reverse=True)
        cnt = 0
        res = []
        for key in keys:
            res+=index_dict[key]
            cnt=len(res)
            if cnt == k:
                break
        return res
class Solution:
    def topKFrequent(self, nums: List[int], k: int) -> List[int]:
        num_dict = defaultdict(int)
        for c in nums:
            num_dict[c]+=1
        kvlist = [] 
        for num,freq in num_dict.items():
            kvlist.append((freq,num))
        kvlist.sort(key=lambda x:x[0],reverse=True)    
        res = []
        for item in kvlist[:k]:
            res.append(item[1])
        return res
  1. 哈希+最小堆
import heapq
class Solution:
    def topKFrequent(self, nums: List[int], k: int) -> List[int]:
        num_dict = defaultdict(int)
        for c in nums:
            num_dict[c]+=1
        pri_que = [] #小顶堆
        for num,freq in num_dict.items():
            heapq.heappush(pri_que,(freq,num))
            if len(pri_que)>k:
                heapq.heappop(pri_que) 
        res = []
        print(pri_que)
        for item in pri_que:
            res.append(item[1])
        return res
posted @ 2024-06-03 22:08  forrestr  阅读(25)  评论(0)    收藏  举报