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

周一太忙了没空打卡,本来想今天赶上进度的,结果被累到了需要休息一下……先把周一的卡补上,希望明天能跟上进度TT

239. 滑动窗口最大值

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 self.queue[-1]<value:
            self.queue.pop()
        self.queue.append(value)
    
    def front(self):
        return self.queue[0]

class Solution(object):
    def maxSlidingWindow(self, nums, k):
        """
        :type nums: List[int]
        :type k: int
        :rtype: List[int]
        """
        results=[]
        queue = MyQueue()

        for j in range(min(len(nums),k)):
            queue.push(nums[j])

        results.append(queue.front())

        for i in range(k, len(nums)):
            queue.pop(nums[i-k])
            queue.push(nums[i])
            results.append(queue.front())
            
        
        return results

347.前 K 个高频元素

  • 题目链接:347.前 K 个高频元素
  • heapq使用(参考csdn博客)
    • heapq.heappush(a, item)是往堆中添加新值,此时自动建立了小根堆。
      • 但heapq里面没有直接提供建立大根堆的方法,可以采取如下方法:每次push时给元素加一个负号(即取相反数),此时最小值变最大值,反之亦然,那么实际上的最大值就可以处于堆顶了,返回时再取负即可。
    • heapq.heapfiy(a)将一个列表转化为小根堆(复杂度O(logn)
    • heapq.heappop(a)从堆中弹出并返回最小的值。如果堆是空的,则引发IndexError。
import heapq

class Solution(object):
    def topKFrequent(self, nums, k):
        """
        :type nums: List[int]
        :type k: int
        :rtype: List[int]
        """
        map_ = {}
        
        for i in range(len(nums)):
            map_[nums[i]] = map_.get(nums[i],0)+1

        pri_que=[]
        
        for key, freq in map_.items():
            heapq.heappush(pri_que,(freq, key))
            if len(pri_que)>k:
                heapq.heappop(pri_que)
        
        result = [0]*k
        for i in range(k-1, -1, -1):
            result[i] = heapq.heappop(pri_que)[1]
        return result

总结

  • 栈里面的元素在内存中是连续分布的么?
    • 这个问题有两个陷阱:
      • 陷阱1:栈是容器适配器,底层容器使用不同的容器,导致栈内数据在内存中不一定是连续分布的。
      • 陷阱2:缺省情况下,默认底层容器是deque,那么deque在内存中的数据分布是什么样的呢? 答案是:不连续的,下文也会提到deque。
  • 滑动窗口最大值问题:单调队列(push和pop规则
  • 求前 K 个高频元素:优先级队列(小顶堆,heapq
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值