代码随想录算法训练营第十二天| 239. 滑动窗口最大值 347.前 K 个高频元素 总结

本文介绍了两种常见的算法问题解决方案:滑动窗口最大值和找出数组中前K个高频元素。滑动窗口最大值通过双端队列实现,保持队列中的元素始终为窗口内的最大值;前K个高频元素则使用小顶堆,维护元素出现频率,并返回频率最高的K个元素。这两种算法在数据结构和算法设计上都有独到之处,适合于处理动态窗口和频率统计的问题。
摘要由CSDN通过智能技术生成

239. 滑动窗口最大值

思路:pop()、push()、getMaxValue()三个步骤进行滑动窗口并选择最大值

push()中已经把比front()小的元素pop掉了,所以用pop()函数只需要把value == front()的时候,把值pop掉

from collections import deque
class MyQueue:
    def __init__(self):
        self.queue = deque()

    def push(self, value):
        while self.queue and self.queue[-1] < value:
            self.queue.pop()
        self.queue.append(value)
    
    def pop(self, value):
        if self.queue and self.queue[0] == value:
            self.queue.popleft()

    def getMaxValue(self):
        return self.queue[0]

class Solution:
    def maxSlidingWindow(self, nums: List[int], k: int) -> List[int]:
        que = MyQueue()
        results = []
        n = len(nums)
        for i in range(k):
            que.push(nums[i])
        results.append(que.getMaxValue())
        for i in range(k, n):
            que.pop(nums[i - k])
            que.push(nums[i])
            results.append(que.getMaxValue())
        return results       

347. 前 K 个高频元素

思路:

小顶堆headp:

代码:

import heapq
class Solution:
    def topKFrequent(self, nums: List[int], k: int) -> List[int]:
        map_ = {}
        for i in range(len(nums)):
            map_[nums[i]] = map_.get(nums[i], 0) + 1
        heapq_ = []
        for key, value in map_.items():
            heapq.heappush(heapq_, (value, key))
            if len(heapq_) > k:
                heapq.heappop(heapq_)
        results = [0] * k
        for i in range(k - 1, -1, -1):
            results[i] = heapq.heappop(heapq_)[1]
        return results

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值