day12(栈与队列)-py

第五章 栈与队列part03

今日内容:

● 239. 滑动窗口最大值

● 347.前 K 个高频元素

● 总结

代码随想录:代码随想录

今天难度真的超标了,有点写自闭了,就稍微摘一点思考和新学的东西吧。

239. 滑动窗口最大值

解题思路:

        开始直接用暴力遍历的方法可以做,但发现复杂度过高,于是需要借助队列。

1.构造一个单调队列,来存储滑动窗口的元素,也就是说需要对滑动窗口中元素的大小进行排序

2.实现单调队列需要满足的条件(核心思想):

        pop(value):如果窗口移除的元素value等于单调队列的出口元素,那么队列弹出元素,否则不用任何操作

        push(value):如果push的元素value大于入口元素的数值,那么就将队列入口的元素弹出,直到push元素的数值小于等于队列入口元素的数值为止

3.即如何维护最大值?将队列中的小值比较后弹出。如何保证滑动窗口元素量为k?若头部为最大,且下一轮要移除,则需要弹出,即将队列中的头部和当前循环索引位置比较。

代码层面:可以使用deque()函数实现双向队列,进行pop()和popleft()操作

347.前 K 个高频元素

解题思想:

1.要统计元素出现频率

2.对频率排序

3.找出前K个高频元素

这题思路比较清晰,主要是代码实现的问题。py写法是真方便,但我是真没见过

小顶堆:最小的元素位于队列最前面,使用了heapq库,push实现为heapq.heappush(pri_que, (freq, key));pop实现为heapq.heappop(pri_que),即超过k个元素后,永远把最小的弹出。

字典用法:map_[nums[i]] = map_.get(nums[i], 0) + 1,即nums[i]有值则直接用,没有值则+1

import heapq
class Solution:
    def topKFrequent(self, nums: List[int], k: int) -> List[int]:
        #要统计元素出现频率
        map_ = {} #nums[i]:对应出现的次数
        for i in range(len(nums)):
            map_[nums[i]] = map_.get(nums[i], 0) + 1
        
        #对频率排序
        #定义一个小顶堆,大小为k
        pri_que = [] #小顶堆
        
        #用固定大小为k的小顶堆,扫描所有频率的数值
        for key, freq in map_.items():
            heapq.heappush(pri_que, (freq, key))
            if len(pri_que) > k: #如果堆的大小大于了K,则队列弹出,保证堆的大小一直为k
                heapq.heappop(pri_que)
        
        #找出前K个高频元素,因为小顶堆先弹出的是最小的,所以倒序来输出到数组
        result = [0] * k
        for i in range(k-1, -1, -1):
            result[i] = heapq.heappop(pri_que)[1]
        return result

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值