一、今天学习队列的应用:
1.leetcode题目 239 滑动窗口最大值(hard):
(发文章以来第一次做hard题,还有点小紧张)
题目描述:
给你一个整数数组 nums
,有一个大小为 k
的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k
个数字。滑动窗口每次只向右移动一位。
返回 滑动窗口中的最大值 。
思路:①可用暴力解法②窗长固定 一进一出 容易想到队列 并且需要求窗内的最大值 可想到单调队列。
解法:
from collections import deque
class Mydeque:
def __init__(self):
self.que = deque()
def pop(self,value):
if self.que and value == self.que[0]:
#由大到小的单调队列 所以popleft
self.que.popleft()
def push(self,value):
while self.que and value > self.que[-1]:
self.que.pop()
self.que.append(value)
def get_front(self):
return self.que[0] #返回当前窗口的最大值 也就是队列的最大值
class Solution:
def maxSlidingWindow(self, nums: List[int], k: int) -> List[int]:
que = Mydeque()
res = []
for i in range(k):
que.push(nums[i])
res.append(que.get_front())
for i in range(k,len(nums)):
que.pop(nums[i-k])
que.push(nums[i])
res.append(que.get_front())
return res
2.leetcode题目 347 前K个高频元素(medium):
题目描述:
给你一个整数数组 nums
和一个整数 k
,请你返回其中出现频率前 k
高的元素。你可以按 任意顺序 返回答案。
个人解题方式:
class Solution:
def topKFrequent(self, nums: List[int], k: int) -> List[int]:
freq = Counter(nums)
sort_freq =sorted(freq.items(), key=lambda x: x[1], reverse=True)
top_k = sort_freq[:k]
return [item[0] for item in top_k]
(注意heapq的优先级是
class Solution:
def topKFrequent(self, nums: List[int], k: int) -> List[int]:
res = collections.defaultdict(int)
i = 0
count = 0
for i in nums:
res[i] += 1
heap = []
for key,val in res.items():
if len(heap)<k:
heapq.heappush(heap,(val,key))
else:
if val>heap[0][0]:
heapq.heappop(heap)
heapq.heappush(heap,(val,key))
res = [key for val,key in heap]
return res
今日需加强学习heapq用法 sorted用法 注意val,key的位置.