美文网首页
leetcode每日一题 python解法 3月7日

leetcode每日一题 python解法 3月7日

作者: Never肥宅 | 来源:发表于2020-03-07 12:17 被阅读0次

    难度:中等

    题目内容:

    请定义一个队列并实现函数 max_value 得到队列里的最大值,要求函数max_value、push_back 和 pop_front 的时间复杂度都是O(1)。

    若队列为空,pop_front 和 max_value 需要返回 -1

    示例 1:

    输入:
    ["MaxQueue","push_back","push_back","max_value","pop_front","max_value"]
    [[],[1],[2],[],[],[]]
    输出: [null,null,null,2,1,2]
    示例 2:

    输入:
    ["MaxQueue","pop_front","max_value"]
    [[],[],[]]
    输出: [null,-1,-1]

    限制:

    1 <= push_back,pop_front,max_value的总操作数 <= 10000
    1 <= value <= 10^5

    题解:

    难度到中等了
    如果直接就普通队列的话,可以实现功能,但是这个max_value的时间复杂度就会变成O(n),很难顶,想做成O(1)还得继续想办法

    import queue
    class MaxQueue:
    
        def __init__(self):
            self.deque = queue.deque()
    
        def max_value(self) -> int:
            return max(self.deque) if self.deque else -1
    
        def push_back(self, value: int) -> None:
            self.deque.append(value)
    
        def pop_front(self) -> int:
            return self.deque.popleft() if self.deque else -1
    

    如果直接做个变量的存储的话,每次push或pop的时候更新存储的最大值
    push更新比较简单,pop就需要搞到去掉pop的数后的最大值,然而一求最大值就又不是O(1)了。
    所以再弄个一个序列去按大小顺序存下队列的数值,每次push和pop虽然要稍微循环一下,但是肯定是小于等于长度n的,多次平均操作也是小于O(n),就视为O(1)


    image.png

    内存占用还蛮不错,但是时间有点拉垮

    代码

    import queue
    class MaxQueue:
    
        def __init__(self):
            self.deque = queue.deque()
            self.m = -1
            self.templ = []
    
        def max_value(self) -> int:
            return max(self.deque) if self.deque else -1
    
        def push_back(self, value: int) -> None:
            if len(self.templ)> 0:
                if value <= self.templ[0]:
                    self.templ = [value] + self.templ
                elif value >= self.templ[-1]:
                    self.templ.append(value)
                else:
                    for i in range(len(self.templ)):
                        if self.templ[i] <= value and self.templ[i+1] >= value:
                            self.templ.insert(i,value)
                            break
            else:
                self.templ.append(value)
            self.deque.append(value)
            if value > self.m:
                self.m = value
    
        def pop_front(self) -> int:
            if not self.deque:
                self.m = -1
                return -1
            p = self.deque.popleft()
            self.templ.remove(p)
            if p > self.m:
                self.m = self.templ[-1]
            return p
    
    
    
    
    # Your MaxQueue object will be instantiated and called as such:
    # obj = MaxQueue()
    # param_1 = obj.max_value()
    # obj.push_back(value)
    # param_3 = obj.pop_front()
    

    官方题解:

    再看下官方的题解
    思路好像差别不是很大
    不过人家写的利索多了

    import queue
    class MaxQueue:
    
        def __init__(self):
            self.deque = queue.deque()
            self.queue = queue.Queue()
    
        def max_value(self) -> int:
            return self.deque[0] if self.deque else -1
    
    
        def push_back(self, value: int) -> None:
            while self.deque and self.deque[-1] < value:
                self.deque.pop()
            self.deque.append(value)
            self.queue.put(value)
    
        def pop_front(self) -> int:
            if not self.deque:
                return -1
            ans = self.queue.get()
            if ans == self.deque[0]:
                self.deque.popleft()
            return ans
    
    作者:LeetCode-Solution
    链接:https://leetcode-cn.com/problems/dui-lie-de-zui-da-zhi-lcof/solution/mian-shi-ti-59-ii-dui-lie-de-zui-da-zhi-by-leetcod/
    来源:力扣(LeetCode)
    著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
    

    相关文章

      网友评论

          本文标题:leetcode每日一题 python解法 3月7日

          本文链接:https://www.haomeiwen.com/subject/dfpqdhtx.html