思路:pop()、push()、getMaxValue()三个步骤进行滑动窗口并选择最大值
push()中已经把比front()小的元素pop掉了,所以用pop()函数只需要把value == front()的时候,把值pop掉
from collections import deque
class MyQueue:
def __init__(self):
self.queue = deque()
def push(self, value):
while self.queue and self.queue[-1] < value:
self.queue.pop()
self.queue.append(value)
def pop(self, value):
if self.queue and self.queue[0] == value:
self.queue.popleft()
def getMaxValue(self):
return self.queue[0]
class Solution:
def maxSlidingWindow(self, nums: List[int], k: int) -> List[int]:
que = MyQueue()
results = []
n = len(nums)
for i in range(k):
que.push(nums[i])
results.append(que.getMaxValue())
for i in range(k, n):
que.pop(nums[i - k])
que.push(nums[i])
results.append(que.getMaxValue())
return results
思路:
小顶堆headp:
代码:
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
heapq_ = []
for key, value in map_.items():
heapq.heappush(heapq_, (value, key))
if len(heapq_) > k:
heapq.heappop(heapq_)
results = [0] * k
for i in range(k - 1, -1, -1):
results[i] = heapq.heappop(heapq_)[1]
return results