代码随想录算法训练营第十一天

24 阅读1分钟

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]