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

本文介绍了两种使用Python数据结构解决算法问题的方法:一是利用单调队列实现滑动窗口的最大值,二是借助heapq的nlargest找到前K个高频元素。在滑动窗口最大值问题中,通过维护一个单调递减的队列,动态更新最大值;在高频元素问题中,使用defaultdict统计频次,并结合heapq找出出现频率最高的K个数。

239. 滑动窗口最大值:


代码思路

单调队列:单调递减队列。
首先初始化好开头的前k个的最大值。
然后每当right_bound向右走一步,res就要添加一个最大值。最大值永远是mq[0]。因为mq是一个单调递减的队列。
也就是右边入队的永远比队列中的值小,如果大于队列中的值,则删除队列中大于这个入队的数的值。
注意的是还要判断滑窗左边缘的值是不是最大值,如果是,下一次滑窗得删除,如果不是则保留。

class Solution:
    def maxSlidingWindow(self, nums: List[int], k: int) -> List[int]:
        from collections import deque
        res = []
        if k <= len(nums):
            mq = deque()
            left_bound = 0
            right_bound = left_bound + k - 1
            for i in range(0, k):
                while len(mq) != 0 and nums[i] > mq[-1]:
                    mq.pop()
                mq.append(nums[i])                        
            res.append(mq[0])     
            

            while right_bound < len(nums)-1:

                right_bound += 1
                left_bound += 1

                if nums[left_bound-1] == mq[0]:
                    mq.popleft()
                while len(mq) != 0 and nums[right_bound] > mq[-1]:
                    mq.pop()
                mq.append(nums[right_bound])  
                res.append(mq[0])

        return res

347. 前 K 个高频元素:


代码思路

优先队列:由heapq来实现。
但这题只需要调用heapq的nlargest即可。

数字出现次数用cnt表示,这步好办,直接defaultdict(int)就可以。
然后cnt要作为heapq的nlargest()方法的key,以key为标准取出k个key最大的数,
也就是传入nlargest()前,defaultdict{num1: cnt1, …}要变成[(cnt1, num1),…,…]的键值对的形式。

class Solution:
    def topKFrequent(self, nums: List[int], k: int) -> List[int]:
        import heapq
        from collections import defaultdict
        hash_map = defaultdict(int)
        for num in nums:
            hash_map[num] += 1
        kv = []
        for num, count in hash_map.items():
            kv.append((count, num))
        res = []
        for cnt, key in heapq.nlargest(k, kv):
            res.append(key)

        return res
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值