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

2020-03-07  本文已影响0人  Never肥宅

难度:中等

题目内容:

请定义一个队列并实现函数 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)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
上一篇下一篇

猜你喜欢

热点阅读