文档讲解:代码随想录
视频讲解:代码随想录B站账号
状态:看了视频题解和文章解析后做出来了
239. 滑动窗口最大值
from collections import deque
class MyQueue:
def __init__(self):
self.queue = deque()
def pop(self, value):
if self.queue and self.queue[0] == value:
self.queue.popleft()
def push(self, value):
while self.queue and value > self.queue[-1]:
self.queue.pop()
self.queue.append(value)
def front(self):
return self.queue[0]
class Solution:
def maxSlidingWindow(self, nums: List[int], k: int) -> List[int]:
que = MyQueue()
result = []
for i in range(k):
que.push(nums[i])
result.append(que.front())
for j in range(k, len(nums)):
que.pop(nums[j-k])
que.push(nums[j])
result.append(que.front())
return result
思路:维护一个单调递减的序列。
push:如果要进入的元素比queue的最后一个元素大,把queue最后一个元素pop,直到遇到一个不比自己小的元素,这样保持了单调递减。
pop:只有当栈头的元素和滑动窗口pop的元素相同的时候,再执行pop操作,其他种情况在push的时候其实已经pop过了。
front:return栈头的值,为当前滑动窗口最大值。
347.前 K 个高频元素
import heapq
class Solution:
def topKFrequent(self, nums: List[int], k: int) -> List[int]:
dicts = {}
for i in range(len(nums)):
if nums[i] not in dicts:
dicts[nums[i]] = 1
else:
dicts[nums[i]] += 1
res = []
for key, freq in dicts.items():
heapq.heappush(res, (freq, key))
if len(res) > k:
heapq.heappop(res)
result = []
for i in range(k):
result.append(heapq.heappop(res)[1]) # pop key
return result
思路:首先用map来计算每个元素在数组中出现的概率,然后用小顶堆来取前k出线次数的元素,这里使用小顶堆是因为小顶堆每次pop的值是当前最小的值,只需把顶堆的长度维护成为k,循环后就得到前k个出现次数最多的元素。