栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

[python刷题模板] 单调队列

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

[python刷题模板] 单调队列

[python刷题模板] 单调队列
    • 一、 算法&数据结构
      • 1. 描述
      • 2. 复杂度分析
      • 3. 常见应用
      • 4. 常用优化
    • 二、 模板代码
      • 1. 询问滑窗最大值
      • 2. 询问向右膨胀的窗最大值
    • 三、其他
    • 四、更多例题
    • 五、参考链接

一、 算法&数据结构 1. 描述
单调队列通常用来维护窗口移动、扩展过程中,当前窗口最大/最小值的问题。
2. 复杂度分析
  1. 队列的复杂度最坏是, O(n),但是平均来说是O(1)
  2. 当我们需要对数组中每个元素都搜一遍的时候,那平均每次操作就是O(1)
3. 常见应用
  1. 窗口极值问题
  2. 背包优化
4. 常用优化
  1. python中的队列可以调用collections.deque
  2. 创建:q = deque()
  3. 询问队列是否非空:if q:
  4. 队尾入队: q.append()
  5. 队尾出队: q.pop()
  6. 队首入队: q.appendleft()
  7. 队首出队: q.popleft()
  8. 询问队尾: q[-1]
  9. 询问队首: q[0]
二、 模板代码 1. 询问滑窗最大值

例题: 239. 滑动窗口最大值
单调队列经典滑窗。
维护一个单调递降队列,队首是答案,队尾判断是否弹出。
窗口滑动时,判断队尾比i小的全部弹出,因为他们对后边的窗口来说贡献不会大于i。
滑动后判断队首元素是否窗外,弹出后,队首就是答案。
参考: [LeetCode解题报告] 滑动窗口最大值

class Solution:
    def maxSlidingWindow(self, nums: List[int], k: int) -> List[int]:
        q = deque()
        for i in range(k):
            while q and nums[i]>=nums[q[-1]]:
                q.pop()
            q.append(i)
        # print(q)
        ans = []
        ans.append(nums[q[0]])
        for i in range(k,len(nums)):
            while q and nums[i]>=nums[q[-1]]:
                q.pop()
            q.append(i)
            if q[0] <= i-k:
                q.popleft()
            # print(i,q)
            ans.append(nums[q[0]])
        return ans
2. 询问向右膨胀的窗最大值

链接: 1499. 满足不等式的最大值
和上一题比,它窗口的左端点看似是不变的,但是加了个限制条件xj-xi<=k(x有序),其实是用这个条件弹出队首。
因此维护单调递降队列,令j>i,则yi + yj + |xi - xj|转化为(yi-xi)+(yj+xj),扫描每个j,队列存y-x的值
参考: [LeetCode解题报告] 1499. 满足不等式的最大值

class Solution:
    def findMaxValueOfEquation(self, points: List[List[int]], k: int) -> int:        
        ans = -1e9
        q = deque()
        x,y = points[0]
        q.append((y-x,x))
        for i in range(1,len(points)):
            x,y = points[i]
            while q and x - q[0][1] > k:
                q.popleft()

            if q:
                ans = max(ans,q[0][0] + x + y)   
            while q and q[-1][0] <= y-x:                        
                q.pop()              

            q.append((y-x,x))
        
        return ans
三、其他
  1. 单调队列和单调栈是强力优化,就是不容易想到。
四、更多例题
  • 待补充
五、参考链接
  • 参考: [LeetCode解题报告] 滑动窗口最大值
  • 参考: [LeetCode解题报告] 1499. 满足不等式的最大值
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/935769.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号