一、LeetCode239. 滑动窗口最大值
1:题目描述(239. 滑动窗口最大值)
给你一个整数数组 nums,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k 个数字。滑动窗口每次只向右移动一位。
返回 滑动窗口中的最大值 。
2:解题思路(239. 滑动窗口最大值)
class MyQueue: # 单调队列
def __init__(self):
self.queue = []
def pop(self, value): # 弹出元素,在什么时候弹出元素
if self.queue and value == self.queue[0]: # 当滑动窗口前面的值等于队列queue的第一个元素时
self.queue.pop(0) # 将队列queue中的第一个元素弹出
def push(self, value): # 添加元素
while self.queue and value > self.queue[-1]: # 当需要添加的元素大于它添加后的前面一个元素
self.queue.pop() # 则将前面一个元素弹出
self.queue.append(value) # 当队列为空了,或者要添加的元素不大于前面的元素,就将元素添加进去
def get_max(self): # 获取最大值
return self.queue[0] # 最大值一直位于队列的第一个元素,所以直接返回第一个元素
class Solution:
def maxSlidingWindow(self, nums, k):
queue = MyQueue()
n = len(nums)
res = []
for i in range(k):
queue.push(nums[i]) # 先将前k个元素放入队列
res.append(queue.get_max()) # 将前k个元素的最大值,放入列表中
for i in range(k,n):
queue.pop(nums[i-k]) # 滑动窗口移除最前面的元素
queue.push(nums[i]) # 加入滑动窗口最后面的元素
res.append(queue.get_max()) # 获取滑动窗口中的最大值
return res
二、LeetCode347.前 K 个高频元素
1:题目描述(347.前 K 个高频元素)
给你一个整数数组 nums
和一个整数 k
,请你返回其中出现频率前 k
高的元素。你可以按 任意顺序 返回答案。
2:解题思路(347.前 K 个高频元素)
import heapq
class Solution:
def topKFrequent(self, nums, k):
set_nums = {}
# 统计元素出现的频率
for item in nums:
if item in set_nums:
set_nums[item] += 1
else:
set_nums[item] = 1
# 对频率排序
# 定义一个小顶堆,大小为k
pri_que = []
# 用固定大小为k的小顶堆,扫描所有频率的数值
for key, freq in set_nums.items():
heapq.heappush(pri_que, (freq, key))
if len(pri_que) > k: # 如果堆的大小小于了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]
return res