2021-04-06 算法打卡第四周 队列最大值 与滑动窗口最大值

本文介绍了两种算法问题的解决方案:第一题是使用队列模拟实现最大值队列,允许O(1)时间复杂度获取最大值和进行元素的入队和出队操作;第二题是滑动窗口最大值问题,利用双端队列在O(1)时间内找到每个窗口的最大值。这两种方法都展示了队列在解决特定问题时的有效性。
摘要由CSDN通过智能技术生成

第一题 剑指 Offer 59 - II. 队列的最大值https://leetcode-cn.com/problems/dui-lie-de-zui-da-zhi-lcof/ 


class MaxQueue:
    def __init__(self):
        self.queue = []
        self.deque = []

    def max_value(self) -> int:
        return self.deque[0] if self.deque else -1

    def push_back(self, value: int) -> None:
        self.queue.append(value)
        while self.deque and self.deque[-1] < value:
            self.deque.pop()
        self.deque.append(value)

    def pop_front(self) -> int:
        if not self.queue: return -1
        val = self.queue.pop(0)
        if val == self.deque[0]:
            self.deque.pop(0)
        return val


# 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()

这一题比较简单 通过列表模拟队列的入和出 也可以使用collection.queue

第二题 剑指 Offer 59 - I. 滑动窗口的最大值https://leetcode-cn.com/problems/hua-dong-chuang-kou-de-zui-da-zhi-lcof/ 

class Solution:
    def maxSlidingWindow(self, nums: List[int], k: int) -> List[int]:
        # 暴力解法
        # if not nums or k == 0: 
        #     return []
        # result = []
        # res = [nums[i] for i in range(k - 1)]
        # nums = nums[k - 1:]
        # for i in nums:
        #     res.append(i)
        #     result.append(max(res))
        #     res.pop(0)
        # return result

        if not nums or k == 0:
            return []
        deque = []
        # 取出第一个窗口
        for i in range(k):
            while deque and deque[-1] < nums[i]:
                deque.pop()
            deque.append(nums[i])
        res = [deque[0]]
        for i in range(k, len(nums)):
            # 确保窗口里面的值不会超出k值
            if deque[0] == nums[i - k]:
                deque.pop(0)
            while deque and deque[-1] < nums[i]:
                deque.pop()
            deque.append(nums[i])
            res.append(deque[0])
        return res

 两种解法,一种就是遍历nums,通过修改窗口内的值,去找出最大值

第二种通过队列的方式 通过滑动窗口的方式,在队列前面弹出值,在队列后面入队列

第二种是借鉴了题解 https://leetcode-cn.com/problems/hua-dong-chuang-kou-de-zui-da-zhi-lcof/solution/mian-shi-ti-59-i-hua-dong-chuang-kou-de-zui-da-1-6/

里面的解题思路,算法流程以及图都画的很详细

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值