第十三天|queue and stack

今天的题都是queue的题,但是不能用default queue需要用到heapq和deque去定义新的queue

239. Sliding Window Maximum

这道题的难点在于怎么去优化出一个满足要求能快速查找的queue

Way1:

直接遍历然后暴力求最值,但是时间复杂度过大

class Solution:
    def maxSlidingWindow(self, nums: List[int], k: int) -> List[int]:
        res=[]
        tmp=deque()
        for i in range(k):
            tmp.append(nums[i])
        res.append(max(tmp))
        for i in range(k,len(nums)):
            tmp.popleft()
            tmp.append(nums[i])
            res.append(max(tmp))
        
        return res

Way2:

第二种就是要设计一个能减少时间复杂度的queue了,主要逻辑在于只记录那些有用的值比如最大值和后续的值,然后每次需要进行比较

class Solution:
    def maxSlidingWindow(self, nums: List[int], k: int) -> List[int]:
        self.q=deque()
        res=[]
        def popp(val):
            if self.q and self.q[0]==val:
                self.q.popleft()
        
        def push(val):
            while self.q and self.q[-1]<val:
                self.q.pop()
            self.q.append(val)
        
        def front(val):
            return self.q[0] 
        
        for i in range(k):
            push(nums[i])
        res.append(front(i))

        for i in range(k,len(nums)):
            popp(nums[i-k])
            push(nums[i])
            res.append(front(i))
        return res

347. Top K Frequent Elements

这道题的难点在于如何进行排序,一种方法是用lambda函数,还有一种就是利用最小堆

Way1:

利用最下堆对map对进行排序然后只保留出现次数最大的k个

import heapq
class Solution:
    def topKFrequent(self, nums: List[int], k: int) -> List[int]:
        dic=Counter(nums)
        q=[]

        for key,v in dic.items():
            heapq.heappush(q,(v,key))
            if len(q)>k:
                heapq.heappop(q)
        res=[]
        for i in range(k,0,-1):
            res.append(heapq.heappop(q)[1])
        return res

总结: stack通常用来进行配对的消消乐,queue通常用来做hashmap的排序以及需要自定义.在这期间还要注意自己的问题,要随时检查自己定义的变量是不是和已知变量有冲突,还有就是数组遍历时候的下标

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值