前一天偷工减料把最后两道题糊弄过去了,但是发现还是不能糊弄嘿嘿,还是要认认真真做题然后把细节理解清楚,这样才能在面试或者下一次遇到的时候对问题更加更加熟悉!
239. 滑动窗口最大值
这道题的思路清晰了之后问题就不困难了。关键是要建造一个类,这个类的实现专门是用于维护滑动窗口中的“可能最大值”而存在的。这个类需要完成两件事:
1)如果最大值已经不在滑动窗口里了怎么弹出?答案是要比较原滑动窗口的最左边值是否在临时列表的第一个,即是否是临时列表的最大值,如果是,就用leftpop将其推出,这是Myque类中的pop函数的含义;
2)新来的值是否要放进我们的临时窗口?这个需要根据我们设计算法的初衷来确定,我们希望临时窗口里是递减的,所以一旦不是递减的了就立刻需要pop出来,同时需要注意que不存在的情况,也许要放进while函数里,这个是Myque类中的push函数所完成的内容。
from collections import deque
class Myque:
def __init__(self):
self.queue = deque()
def pop(self, value_before):
if self.queue and self.queue[0] == value_before:
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]:
result = []
que = Myque()
for i in range(k):
que.push(nums[i])
result.append(que.front())
for i in range(k, len(nums)):
que.pop(nums[i-k])
que.push(nums[i])
result.append(que.front())
return result
347. 前k个高频元素
这道题上次做完全属于默写出来的。。这次需要再努力一点重来一次,争取理解更深入哈哈哈哈。
这道题的收获就是了解python中所存在的一个heapq库,在这个库里默认的是最小堆,也就是二叉树的每个父节点的key的值(注意这里是key)都比子节点的key的值要小,最大堆则相反。
同时,heapq库中有很多函数可以很方便地压入弹出,了解了这些函数之后实现最后的结果就是自然而然的事了。
以及忘了,这道题其实是分为两个部分,第一个部分是计数,这个用哈希表就可以完成,第二个部分是排序,那么我们用小根堆就可以解决。之所以不用大根堆,是因为我们每次pop走的都是最小的数,而保持二叉树中元素个数只有k个,就能使得大的数“沉”在下方。
import heapq
class Solution:
def topKFrequent(self, nums: List[int], k: int) -> List[int]:
#第一步,先进行计数
dic = {}
for i in nums:
dic[i] = dic.get(i, 0) + 1
#计数完之后构造heapq
pri_que = []
for (num, freq) in dic.items():
heapq.heappush(pri_que, (freq, num))
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
具体实现的时候要注意,小根堆就是用一个列表【】来记录,只是在Push以及Pop的时候是作为heapq的参数输入的。需要多练习。