训练营Day13 | 栈与队列

46 阅读1分钟

239. 滑动窗口最大值

暴力法(超时)

class Solution: 
    def maxSlidingWindow(self, nums: List[int], k: int) -> List[int]: 
        res = [] 
        res.append(max(nums[:k])) 
        for i in range(k,len(nums)): 
            if nums[i-k] != res[-1]: 
                if nums[i] > res[-1]: 
                    res.append(nums[i]) 
                else: 
                    res.append(res[-1]) 
            else: 
                res.append(max(nums[i-k+1:i+1])) 
        return res

单调队列(待补充)

347. 前 K 个高频元素

from collections import defaultdict
import heapq
class Solution:
    def topKFrequent(self, nums: List[int], k: int) -> List[int]:
        d = defaultdict(int)
        for i in nums:
            d[i] += 1
        
        sd = sorted(d.items(), key = lambda kv:(kv[1], kv[0]))
        
        res = []
        print(sd)
        for key in sd:
            res.append(key[0])
        return res[-k:]

        # pri_que = [] #小顶堆
        
        # #用固定大小为k的小顶堆,扫面所有频率的数值
        # # 记得把频率放在前面 才能实现排序
        # for key, freq in d.items():
        #     heapq.heappush(pri_que, (freq, key))
        #     if len(pri_que) > k: #如果堆的大小大于了K,则队列弹出,保证堆的大小一直为k
        #         heapq.heappop(pri_que)
        # print(pri_que)
        # #找出前K个高频元素,因为小顶堆先弹出的是最小的,所以倒序来输出到数组
        # result = [0] * k
        # for i in range(k-1, -1, -1):
        #     result[i] = heapq.heappop(pri_que)[1]
        # return result