今天的题都是queue的题,但是不能用default queue需要用到heapq和deque去定义新的queue
239. Sliding Window Maximum
这道题的难点在于怎么去优化出一个满足要求能快速查找的queue
Way1:
直接遍历然后暴力求最值,但是时间复杂度过大
class Solution:
def maxSlidingWindow(self, nums: List[int], k: int) -> List[int]:
res=[]
tmp=deque()
for i in range(k):
tmp.append(nums[i])
res.append(max(tmp))
for i in range(k,len(nums)):
tmp.popleft()
tmp.append(nums[i])
res.append(max(tmp))
return res
Way2:
第二种就是要设计一个能减少时间复杂度的queue了,主要逻辑在于只记录那些有用的值比如最大值和后续的值,然后每次需要进行比较
class Solution:
def maxSlidingWindow(self, nums: List[int], k: int) -> List[int]:
self.q=deque()
res=[]
def popp(val):
if self.q and self.q[0]==val:
self.q.popleft()
def push(val):
while self.q and self.q[-1]<val:
self.q.pop()
self.q.append(val)
def front(val):
return self.q[0]
for i in range(k):
push(nums[i])
res.append(front(i))
for i in range(k,len(nums)):
popp(nums[i-k])
push(nums[i])
res.append(front(i))
return res
347. Top K Frequent Elements
这道题的难点在于如何进行排序,一种方法是用lambda函数,还有一种就是利用最小堆
Way1:
利用最下堆对map对进行排序然后只保留出现次数最大的k个
import heapq
class Solution:
def topKFrequent(self, nums: List[int], k: int) -> List[int]:
dic=Counter(nums)
q=[]
for key,v in dic.items():
heapq.heappush(q,(v,key))
if len(q)>k:
heapq.heappop(q)
res=[]
for i in range(k,0,-1):
res.append(heapq.heappop(q)[1])
return res
总结: stack通常用来进行配对的消消乐,queue通常用来做hashmap的排序以及需要自定义.在这期间还要注意自己的问题,要随时检查自己定义的变量是不是和已知变量有冲突,还有就是数组遍历时候的下标