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

被折叠的 条评论
为什么被折叠?



