力扣394.字符串解码、739.每日温度、84.柱状图中最大的矩形

394.字符串解码

参考:

字节写了半天没写出来。。不知道怎么处理有嵌套的情况,就看了题解https://leetcode.cn/problems/decode-string/solutions/19447/decode-string-fu-zhu-zhan-fa-di-gui-fa-by-jyd

思路:

用一个栈同时将倍数和临时字符成对进栈。

1、当遇到左括号时进栈并将对应变量重置,以便重新记录

2、当遇到右括号时出栈并根据倍数和字符进行拼接

3、当遇到数字时记录倍数,要注意的是可能不一定只有个位,还有十位百位等

4、当遇到字符时,直接拼接形成临时字符,这是处理嵌套情形的关键

代码:

python 复制代码
class Solution:
    def decodeString(self, s: str) -> str:
        stack, res, multi = [], "", 0
        for c in s:
            if c == '[':
                stack.append([multi, res])
                res, multi = "", 0
            elif c == ']':
                cur_multi, cur_res = stack.pop()
                res = cur_res + cur_multi * res
            elif '0' <= c <= '9':
                multi = multi * 10 + int(c)
            else:
                res += c

        return res
                

复杂度分析:

  • 时间复杂度 O(N),一次遍历 s
  • 空间复杂度 O(N),辅助栈在极端情况下需要线性空间,例如 2[2[2[a]]]

739.每日温度

方法一:

思路:

一个数组记录相邻的温度差,再一个数组记录结果。相邻温度差大于0的,直接赋值为1;否则用一个变量来记录从这一位开始的温度差之和何时大于0,记录下下标差。

意料之中的超时了,而且思路还更复杂。。。什么脑袋,明明可以直接用两个循环超时反而用了更复杂的写法。。不知道之前是做什么题目使得我的脑袋里面出现了这个思路。。看下一个方法吧,我只是记录一下

代码:

python 复制代码
class Solution:
    def dailyTemperatures(self, temperatures: List[int]) -> List[int]:
        n = len(temperatures)
        prefix, res = [0] * n, [0] * n
        
        for i in range(n - 1):
            prefix[i] = temperatures[i + 1] - temperatures[i]

        for i in range(n):
            if prefix[i] > 0:
                res[i] = 1
                continue
            sum_ = 0
            for j in range(i, n):
                sum_ += prefix[j]
                if sum_ > 0:
                    res[i] = j - i + 1
                    break

        return res

方法二:

参考:

739. 每日温度 | 代码随想录

思路:

保持一个从栈顶到栈底的单调递增栈,将栈顶对应元素和数组元素进行比较,若栈顶更大,则将数组下标入栈;若栈顶小的话说明遇到了相比这一天更高的温度,可以记录二者的下标差并弹出元素。

注意:记录下标比记录温度更方便修改

代码:

python 复制代码
class Solution:
    def dailyTemperatures(self, temperatures: List[int]) -> List[int]:
        n = len(temperatures)
        result = [0] * n
        stack = [0]

        for i in range(1, n):
            if temperatures[i] <= temperatures[stack[-1]]:
                stack.append(i)
            else:
                while len(stack) != 0 and temperatures[i] > temperatures[stack[-1]]:
                    result[stack[-1]] = i - stack[-1]
                    stack.pop()
                stack.append(i)

        return result

复杂度分析:

  • 时间复杂度:O(N)
  • 空间复杂度:O(N)

84.柱状图中最大的矩形

参考思路:

84.柱状图中最大的矩形 | 代码随想录

代码:

python 复制代码
class Solution:
    def largestRectangleArea(self, heights: List[int]) -> int:
        # 在数组头尾各增加一个0元素,以免单调增/减数组导致没有右/左边界的情况
        heights.insert(0, 0)  # 在0处插入0
        heights.append(0)

        stack = [0]
        result = 0

        for i in range(1, len(heights)):
            if heights[i] > heights[stack[-1]]:
                stack.append(i)
            elif heights[i] == heights[stack[-1]]:  # 如果遇到相同高度的柱子,需要使用最右边的柱子来计算宽度
                stack.pop()
                stack.append(i)
            else:
                while len(stack) != 0 and heights[i] < heights[stack[-1]]:
                    h = heights[stack[-1]]
                    stack.pop()
                    if stack:
                        w = i - stack[-1] - 1
                        result = max(result, h * w)
                stack.append(i)

        return result
相关推荐
ECT-OS-JiuHuaShan17 分钟前
整体论体系定理,全球开放,无法绕过
人工智能·科技·学习·算法·生活
贾斯汀玛尔斯32 分钟前
每天学一个算法--BM25(Okapi BM25)
算法
weixin_5689960636 分钟前
c++如何实现日志文件的异步落盘功能_基于无锁队列方案【附代码】
jvm·数据库·python
chaofan98042 分钟前
GPT-5.5 全压力测试:为什么 API 聚合调度是解决“首字延迟”的技术关键?
开发语言·人工智能·python·gpt·自动化·api
才兄说43 分钟前
机器人二次开发机器人动作定制?定制化舞蹈
python
曲幽1 小时前
FastAPI配置管理避坑指南:从硬编码到 .env 与 pydantic_settings 类,连路由用法都给你捋清楚
python·fastapi·web·settings·config·pydantic·.env·dotenv·.env.prod
grant-ADAS1 小时前
Overlay套刻测量
算法
淘矿人1 小时前
2026年4月-DeepSeek V4 vs GPT-5.5深度对比测评:weelinking一键切换实测
服务器·数据库·人工智能·python·gpt·学习·php
猿长大人1 小时前
算法 | Douglas-Peucker 拯救“腰椎间盘突出的三角形”
算法
一只幸运猫.1 小时前
Google Mug库——一个现代的通用工具库
开发语言·python