开始第三天的练习,今天的题偏难
第一题
You are given an array of integers
nums, there is a sliding window of sizekwhich is moving from the very left of the array to the very right. You can only see theknumbers in the window. Each time the sliding window moves right by one position.Return the max sliding window.
这是这么多天来第一次碰到Hard难度的题,可能因为我刷的题不够多,我觉得难度和medium差不多。
用一个滑动窗口来看当前窗口中的最大值,并且append到一个保存结果的数组中,程序运行结束return这个数组即可。
不管k等于多少,窗口每次移动 1 position,因此选择栈的思路比较方便。可是在进一步推理的时候,就觉得不对劲,栈中的元素如果pop出去,就有可能把需要求的最大值移除了。
看了视频解析,明白了这道题用单调队列可以解出来
from collections import deque
class MyQueue: #单调队列(从大到小
def __init__(self):
self.queue = deque() #这里需要使用deque实现单调队列,直接使用list会超时
#每次弹出的时候,比较当前要弹出的数值是否等于队列出口元素的数值,如果相等则弹出。
#同时pop之前判断队列当前是否为空。
def pop(self, value):
if self.queue and value == self.queue[0]:
self.queue.popleft()#list.pop()时间复杂度为O(n),这里需要使用collections.deque()
#如果push的数值大于入口元素的数值,那么就将队列后端的数值弹出,直到push的数值小于等于队列入口元素的数值为止。
#这样就保持了队列里的数值是单调从大到小的了。
def push(self, value):
while self.queue and value > self.queue[-1]:
self.queue.pop()
self.queue.append(value)
#查询当前队列里的最大值 直接返回队列前端也就是front就可以了。
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): #先将前k的元素放进队列
que.push(nums[i])
result.append(que.front()) #result 记录前k的元素的最大值
for i in range(k, len(nums)):
que.pop(nums[i - k]) #滑动窗口移除最前面元素
que.push(nums[i]) #滑动窗口前加入最后面的元素
result.append(que.front()) #记录对应的最大值
return result
第二题
Given an integer array
numsand an integerk, return thekmost frequent elements. You may return the answer in any order.
这道题有三个东西需要实现:
- 要统计元素出现频率
- 对频率排序
- 找出前K个高频元素
import heapq
class Solution:
def topKFrequent(self, nums: List[int], k: int) -> 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
这道题的顶堆那里有点不理解,等过完二叉树部分,再回来看看
本文介绍了两道编程题目:使用单调队列解决SlidingWindowMaximum问题,以及利用堆实现TopKFrequentElements,统计并返回数组中出现频率最高的前k个元素。作者反思了在处理TopKFrequentElements时对堆的理解,并表示会在后续深入学习二叉树部分。

162

被折叠的 条评论
为什么被折叠?



