代码随想录Day13|栈与队列两道难题总结

前一天偷工减料把最后两道题糊弄过去了,但是发现还是不能糊弄嘿嘿,还是要认认真真做题然后把细节理解清楚,这样才能在面试或者下一次遇到的时候对问题更加更加熟悉!

239. 滑动窗口最大值

在这里插入图片描述
这道题的思路清晰了之后问题就不困难了。关键是要建造一个类,这个类的实现专门是用于维护滑动窗口中的“可能最大值”而存在的。这个类需要完成两件事:
1)如果最大值已经不在滑动窗口里了怎么弹出?答案是要比较原滑动窗口的最左边值是否在临时列表的第一个,即是否是临时列表的最大值,如果是,就用leftpop将其推出,这是Myque类中的pop函数的含义;
2)新来的值是否要放进我们的临时窗口?这个需要根据我们设计算法的初衷来确定,我们希望临时窗口里是递减的,所以一旦不是递减的了就立刻需要pop出来,同时需要注意que不存在的情况,也许要放进while函数里,这个是Myque类中的push函数所完成的内容。

from collections import deque
class Myque:
    def __init__(self):
        self.queue = deque()
    def pop(self, value_before):
        if self.queue and self.queue[0] == value_before:
            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]:
        result = []
        que = Myque()
        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

347. 前k个高频元素

这道题上次做完全属于默写出来的。。这次需要再努力一点重来一次,争取理解更深入哈哈哈哈。
这道题的收获就是了解python中所存在的一个heapq库,在这个库里默认的是最小堆,也就是二叉树的每个父节点的key的值(注意这里是key)都比子节点的key的值要小,最大堆则相反。
同时,heapq库中有很多函数可以很方便地压入弹出,了解了这些函数之后实现最后的结果就是自然而然的事了。
以及忘了,这道题其实是分为两个部分,第一个部分是计数,这个用哈希表就可以完成,第二个部分是排序,那么我们用小根堆就可以解决。之所以不用大根堆,是因为我们每次pop走的都是最小的数,而保持二叉树中元素个数只有k个,就能使得大的数“沉”在下方。

import heapq
class Solution:
    def topKFrequent(self, nums: List[int], k: int) -> List[int]:
        #第一步,先进行计数
        dic = {}
        for i in nums:
            dic[i] = dic.get(i, 0) + 1
        #计数完之后构造heapq
        pri_que = []
        for (num, freq) in dic.items():
            heapq.heappush(pri_que, (freq, num))
            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

具体实现的时候要注意,小根堆就是用一个列表【】来记录,只是在Push以及Pop的时候是作为heapq的参数输入的。需要多练习。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值