代码随想录算法训练营第十三天| 栈和队列:239. 滑动窗口最大值,347.前 K 个高频元素,总结(python)

本文介绍了如何使用双端队列解决滑动窗口最大值问题,以及利用小顶堆实现Top-K频率元素查找。两种数据结构在处理动态数组中的最大值和高频元素时展现出高效性。滑动窗口最大值问题中,双端队列用于保持窗口内的最大元素;而Top-K问题中,小顶堆则用于维护频率最高的元素集合。这两种数据结构的巧妙结合为复杂问题提供了简洁的解决方案。
摘要由CSDN通过智能技术生成

第十二天是周日,休息。今天开始第十三天打卡~

讲解链接:239. 滑动窗口最大值

思路是用deque双向列表维护可能的最大元素。其中push原理是从队尾进入的元素要与队中元素从尾到头依次比对,将小于新元素的元素全部从队尾删去,直到队列为空或者前方元素大于等于新元素。

from collections import deque

class MyQueue:
    def __init__(self):
        self.queue = deque()
    def pop(self, value):
        if self.queue and value == self.queue[0]:
            self.queue.popleft()
    def push(self, value):
        while self.queue and value > self.queue[-1]:
            self.queue.pop()
        self.queue.append(value)
    def front(self):
        return self.queue[0]
        
class Solution:
    def maxSlidingWindow(self, nums: List[int], k: int) -> List[int]:
        que = MyQueue()
        result = []
        for i in range(k):
            que.push(nums[i])
        result.append(que.front())
        for i in range(k, len(nums)):
            que.pop(nums[i-k])
            que.push(nums[i])
            result.append(que.front())
        return result

讲解链接:

用map维护每个数字的出现频率,之后用小顶堆维护前k高的频率和对应的数字。

import heapq
class Solution:
    def topKFrequent(self, nums: List[int], k: int) -> List[int]:
        #记录nums中数出现的频率
        map = dict()
        for i in range(len(nums)):
            map[nums[i]] = map.get(nums[i], 0) + 1

        priority_que = [] #小顶堆

        for key, freq in map.items():
            heapq.heappush(priority_que, (freq, key))
            if len(priority_que) > k: 
                heapq.heappop(priority_que)
        
        res = [0] * k
        for i in range(k-1, -1, -1): #小顶堆是按从小到大顺序出来的,所以需要倒序存
            res[i] = heapq.heappop(priority_que)[1]
        return res

栈与队列总结

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值