网站别人做的我自己怎么续费,wordpress插件微信,注册境外服务公司,网站建设中网站需求分析和报告工能论文滑动窗口最大值和前K个高频元素
239. 滑动窗口最大值
核心#xff1a;建立一个单调队列#xff0c;维护里面的最大值#xff0c;并且从大到小的顺序即可#xff01;【只需要维护有可能成为窗口里最大值的元素就可以了#xff0c;同时保证队列里的元素数值是由大到小的。…滑动窗口最大值和前K个高频元素
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 value self.queue[-1]:self.queue.pop()self.queue.append(value)def front(self):return self.queue[0]
# 先判断前面的元素弹出在插入后面的元素
class Solution:def maxSlidingWindow1(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 i in range(k,len(nums)):# 滑动窗口移除到最前面元素que.pop(nums[i - k])# 滑动窗口前加入最后的元素que.push(nums[i])result.append(que.front())return resultdef maxSlidingWindow(self, nums: List[int], k: int) - List[int]:# 自己实现单调队列que []result []for i in range(k):while que and que[-1] nums[i]:que.pop(-1) # list.pop()时间复杂度是o(N) 这里会超时que.append(nums[i])result.append(que[0])for i in range(k,len(nums)):if que and que[0] nums[i - k]:que.pop(0)while que and que[-1] nums[i]:que.pop(-1)que.append(nums[i])result.append(que[0])return result
347. 前 K 个高频元素
核心利用字典排序的一些方法这些方法比较解题关键
第一种
f zip(d.keys(), d.values())
c sorted(f)
第二种
a sorted(d.items(), keylambda x: x[1])
a1 sorted(d.items(),key lambda x:x[1],reverse True)import heapq
class Solution:def topKFrequent1(self, nums: List[int], k: int) - List[int]:dict_1 {}res []for v in nums:if v in dict_1:dict_1[v] 1else:dict_1[v] 1a1 sorted(dict_1.items(),key lambda x:x[1],reverse True)# print(a1)for i in a1[:k]:res.append(i[0])return res# 使用堆来实现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 # 对map进行排序# 定义一个小顶堆 大小为kpri_que []for key, value in map_.items():heapq.heappush(pri_que, (value, key))if len(pri_que) k: # 如果堆的大小大于了K 则队列弹出保证对大小为kheapq.heappop(pri_que)result [0] * kfor i in range(k - 1, -1, -1):result[i] heapq.heappop(pri_que)[1]return result