150.逆波兰表达式求值
这里要注意的是两个相邻的数异号相除的问题。还有用字典承接运算符的操作很有意思
from operator import add,sub,mul
def div(num1,num2):
return num1//num2 if num1 * num2 > 0 else -(abs(num1) // abs(num2))
class Solution:
def evalRPN(self, tokens: List[str]) -> int:
op={'+':add,'-':sub,'*':mul,'/':div}
stack=[]
for token in tokens:
if token not in {'+','-','*','/'}:
stack.append(int(token))
else:
op1=stack.pop()
op2=stack.pop()
stack.append(op[token](op2,op1))
return stack.pop()
239.滑动窗口最大值
既然是求滑动窗口最大值,那么很自然的会想到使用滑动窗口的方法去做这道题,当然超时就是另一回事了QWQ
现在下面贴上超时的代码(虽然我觉得代码本身是没什么问题的)
class Solution:
def maxSlidingWindow(self, nums: List[int], k: int) -> List[int]:
if len(nums)==1:
return nums
left=0;right=k-1
res=[]
while right <= len(nums)-1:
max_value=max(nums[left:right+1])
res.append(max_value)
left+=1
right+=1
return res
使用单调队列去解决这道问题(后面还需要复习)
class Solution:
#单调队列的实现
class MonotonicQueue:
def __init__(self):
self.q=[]
def push(self,n):
#小于n的元素全部删除
while self.q and self.q[-1]<n:
self.q.pop()
#将n加入尾部
self.q.append(n)
def max(self):
return self.q[0]
def pop(self,n):
if n==self.q[0]:
self.q.pop(0)
def maxSlidingWindow(self, nums: List[int], k: int) -> List[int]:
window=self.MonotonicQueue()
res=[]
for i in range(len(nums)):
if i<k-1:
window.push(nums[i])
else:
window.push(nums[i])
res.append(window.max())
window.pop(nums[i-k+1])
return res
347.前k个高频元素
暂时真的想不到怎么使用队列的方法做,先提供一下自己的思路。比较简单,就是用字典统计,然后对键进行排序。复杂度是O(nlogn)
class Solution:
def topKFrequent(self, nums: List[int], k: int) -> List[int]:
cnt=dict()
for num in nums:
cnt[num]=cnt.get(num,0)+1
sorted_keys = sorted(cnt, key=cnt.get,reverse=True)
return sorted_keys[0:k]