当前位置: 首页 > news >正文

2025-2-24-4.9 单调栈与单调队列(基础题)

文章目录

  • 4.9 单调栈与单调队列(基础题)
    • 单调栈
    • 739. 每日温度
    • 42. 接雨水
    • 单调队列
    • 239. 滑动窗口最大值

4.9 单调栈与单调队列(基础题)

  很有趣的两个数据结构。
原视频讲解链接

单调栈

在这里插入图片描述

739. 每日温度

题目链接
给定一个整数数组 temperatures ,表示每天的温度,返回一个数组 answer ,其中 answer[i] 是指对于第 i 天,下一个更高温度出现在几天后。如果气温在这之后都不会升高,请在该位置用 0 来代替。

示例 1:
输入: temperatures = [73,74,75,71,69,72,76,73]
输出: [1,1,4,2,1,1,0,0]

示例 2:
输入: temperatures = [30,40,50,60]
输出: [1,1,1,0]

示例 3:
输入: temperatures = [30,60,90]
输出: [1,1,0]

提示:

  • 1 <= temperatures.length <= 10^5
  • 30 <= temperatures[i] <= 100
class Solution:
    def dailyTemperatures(self, temp: List[int]) -> List[int]:
        """
        时间复杂度:O(n),其中n为temperatures的长度。
        空间复杂度:O(n)。
        """
        n = len(temp)
        ans = [0] * n
        st = [] # to do list
        for i,t in enumerate(temp):
            while st and t > temp[st[-1]]:
                j = st.pop()
                ans[j] = i - j
            st.append(i)
        return ans

42. 接雨水

题目链接
给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。

示例 1:
在这里插入图片描述
输入:height = [0,1,0,2,1,0,1,3,2,1,2,1]
输出:6
解释:上面是由数组 [0,1,0,2,1,0,1,3,2,1,2,1] 表示的高度图,在这种情况下,可以接 6 个单位的雨水(蓝色部分表示雨水)。

示例 2:
输入:height = [4,2,0,3,2,5]
输出:9

提示:

  • n == height.length
  • 1 <= n <= 2 * 10^4
  • 0 <= height[i] <= 10^5
class Solution:
    def trap(self, height: List[int]) -> int:

        """
        单调栈解法
        时间复杂度:O(n),其中n为height的长度。
        空间复杂度:O(min(n,U)),其中U=max(height)−min(height)+1。
            注意栈中没有重复元素,在height值域很小的情况下,
            空间复杂度主要取决于height的值域范围。
        """
        ans = 0
        st = []
        for i,h in enumerate(height):
            while st and h >= height[st[-1]]:
                bottom_h = height[st.pop()]
                if not st:
                    break
                left = st[-1]
                dh = min(height[left],h) - bottom_h
                ans += dh * (i - left - 1)
            st.append(i)
        
        return ans    

单调队列

在这里插入图片描述

239. 滑动窗口最大值

题目链接
给你一个整数数组 nums,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k 个数字。滑动窗口每次只向右移动一位。

返回 滑动窗口中的最大值 。

示例 1:
输入:nums = [1,3,-1,-3,5,3,6,7], k = 3
输出:[3,3,5,5,6,7]
解释:
滑动窗口的位置 最大值


[1 3 -1] -3 5 3 6 7 3
1 [3 -1 -3] 5 3 6 7 3
1 3 [-1 -3 5] 3 6 7 5
1 3 -1 [-3 5 3] 6 7 5
1 3 -1 -3 [5 3 6] 7 6
1 3 -1 -3 5 [3 6 7] 7

示例 2:
输入:nums = [1], k = 1
输出:[1]

提示:

  • 1 <= nums.length <= 10^5
  • -10^4 <= nums[i] <= 10^4
  • 1 <= k <= nums.length
class Solution:
    def maxSlidingWindow(self, nums: List[int], k: int) -> List[int]:
        """
        时间复杂度:O(n),其中 n 为 nums 的长度。
            由于每个下标至多入队出队各一次,所以二重循环的循环次数是 O(n) 的。
        空间复杂度:O(min(k,U)),其中 U 是 nums 中的不同元素个数(本题至多为 20001)。
                双端队列至多有 k 个元素,同时又没有重复元素,所以也至多有 U 个元素,
                所以空间复杂度为 O(min(k,U))。返回值的空间不计入。

        """

        ans = []
        q = deque()

        for i, x in enumerate(nums):
            # Enter
            while q and nums[q[-1]] < x:
                q.pop()
            q.append(i)

            # Leave
            if i - q[0] >= k:
                q.popleft()
            
            # Record
            if i >= k - 1:
                ans.append(nums[q[0]])
            
        return ans
        

相关文章:

  • 计算机毕业设计Hadoop+Spark+DeepSeek-R1大模型民宿推荐系统 hive民宿可视化 民宿爬虫 大数据毕业设计(源码+文档+PPT+讲解)
  • steam_api.dll丢失3分钟修复指南,解决Steam游戏无法运行
  • STM32 HAL库0.96寸OLED显示液晶屏
  • 图解感知机(Perceptron)
  • Linux与自动化的基础
  • 2025年02月24日Github流行趋势
  • 解决鼠标唤醒关屏状态下的笔记本
  • leetcode 207. 课程表
  • Qt基础之四十九:Qt属性系统(Property System)
  • 【学习笔记】LLM+RL
  • mapbox基础,使用geojson加载fill-extrusion三维填充图层
  • @Async 异步方法,并配置定制线程池
  • GitHub免密操作与跨服务器通行:SSH密钥一站式配置指南
  • ubuntu开机自动挂载硬盘
  • 测试用例的Story是什么?
  • uniapp 微信小程序打包之后vendor.js 主包体积太大,解决办法,“subPackages“:true设置不生效
  • 实战技巧:如何快速提高网站收录的权威性?
  • 23种设计模式之《外观模式(Facade)》在c#中的应用及理解
  • Spring高级篇-Spring IOC容器 Aware 接口
  • 一周热点:马斯克让OpenAI变的更加具有变数
  • 央媒聚焦文明交流互鉴中的“上博现象” :跨越山海,抒写自信
  • 专利申请全球领先!去年我国卫星导航与位置服务产值超5700亿元
  • 广州医药集团有限公司原党委书记、董事长李楚源被“双开”
  • 公示资费套餐、规范营销行为,今年信息通信行业将办好这十件实事
  • 首次公布!我国空间站内发现微生物新物种
  • 日本一季度实际GDP环比下降0.2%