239. Sliding Window Maximum
核心思想是建立一个单调队列,队列中元素从大到小 ,保证当前窗口的最大值在队列出口;
pop()操作:只有当要pop的value == 当前队列中的最大值,才会执行;
push()操作:弹出所有比value小的,再加入新值
from collections import deque
class MyQueue:
def __init__(self):
self.queue = deque()
# 单调队列中从大到小,如果值是最大的(即出口处),则弹出
def pop(self, value):
if self.queue and value == self.queue[0]:
self.queue.popleft()
# 弹出所有比value小的,再加入新值
def push(self, value):
while self.queue and value > self.queue[-1]:
self.queue.pop()
self.queue.append(value)
# queue[0]即为队列中最大值
def max(self):
return self.queue[0]
class Solution:
def maxSlidingWindow(self, nums: List[int], k: int) -> List[int]:
que = MyQueue()
res = []
# 先将前k个元素放入队列
for i in range(k):
que.push(nums[i])
# 第一个窗口的最大值
res.append(que.max())
for i in range(k, len(nums)):
que.pop(nums[i - k]) #滑动窗口移除最前面元素
que.push(nums[i])
res.append(que.max())
return res
347. Top K Frequent Elements
先统计词频,再建立一个小顶堆,建立的同时保证堆的大小为k。
Python中需要使用heapq这个第三方库。
heapq — 堆队列算法 — Python 3.11.0 文档…
import heapq # 堆队列算法
class Solution:
def topKFrequent(self, nums: List[int], k: int) -> List[int]:
# 统计元素出现频率
map_ = {}
for num in nums:
if num not in map_:
map_[num] = 1
else:
map_[num] += 1
pri_que = [] #小顶堆
for key, freq in map_.items():
heapq.heappush(pri_que, (freq, key))
if len(pri_que) > k: # 保障堆的大小=k
heapq.heappop(pri_que)
# 找出前K个高频元素,因为小顶堆先弹出的是最小的,所以倒序来输出到数组
res = [0] * k
for i in range(k-1, -1, -1):
res[i] = heapq.heappop(pri_que)[1] #[1]是key
return res