周一太忙了没空打卡,本来想今天赶上进度的,结果被累到了需要休息一下……先把周一的卡补上,希望明天能跟上进度TT
239. 滑动窗口最大值
- 题目链接:239.滑动窗口最大值
- 单调队列的几个操作
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()
def push(self, value):
while self.queue and self.queue[-1]<value:
self.queue.pop()
self.queue.append(value)
def front(self):
return self.queue[0]
class Solution(object):
def maxSlidingWindow(self, nums, k):
"""
:type nums: List[int]
:type k: int
:rtype: List[int]
"""
results=[]
queue = MyQueue()
for j in range(min(len(nums),k)):
queue.push(nums[j])
results.append(queue.front())
for i in range(k, len(nums)):
queue.pop(nums[i-k])
queue.push(nums[i])
results.append(queue.front())
return results
347.前 K 个高频元素
- 题目链接:347.前 K 个高频元素
- heapq使用(参考csdn博客)
- heapq.heappush(a, item)是往堆中添加新值,此时自动建立了小根堆。
- 但heapq里面没有直接提供建立大根堆的方法,可以采取如下方法:每次push时给元素加一个负号(即取相反数),此时最小值变最大值,反之亦然,那么实际上的最大值就可以处于堆顶了,返回时再取负即可。
- heapq.heapfiy(a)将一个列表转化为小根堆(复杂度O(logn)
- heapq.heappop(a)从堆中弹出并返回最小的值。如果堆是空的,则引发IndexError。
- heapq.heappush(a, item)是往堆中添加新值,此时自动建立了小根堆。
import heapq
class Solution(object):
def topKFrequent(self, nums, k):
"""
:type nums: List[int]
:type k: int
:rtype: List[int]
"""
map_ = {}
for i in range(len(nums)):
map_[nums[i]] = map_.get(nums[i],0)+1
pri_que=[]
for key, freq in map_.items():
heapq.heappush(pri_que,(freq, key))
if len(pri_que)>k:
heapq.heappop(pri_que)
result = [0]*k
for i in range(k-1, -1, -1):
result[i] = heapq.heappop(pri_que)[1]
return result
总结
- 栈里面的元素在内存中是连续分布的么?
- 这个问题有两个陷阱:
- 陷阱1:栈是容器适配器,底层容器使用不同的容器,导致栈内数据在内存中不一定是连续分布的。
- 陷阱2:缺省情况下,默认底层容器是deque,那么deque在内存中的数据分布是什么样的呢? 答案是:不连续的,下文也会提到deque。
- 这个问题有两个陷阱:
- 滑动窗口最大值问题:单调队列(push和pop规则
- 求前 K 个高频元素:优先级队列(小顶堆,heapq