【代码随想录训练营】【Day 63】【单调栈-2】| Leetcode 42, 84

news/2024/7/9 12:44:58 标签: leetcode, 算法, 职场和发展

【代码随想录训练营】【Day 63】【单调栈-2】| Leetcode 42, 84

需强化知识点

  • 单调栈强化

题目

leetcode.cn/problems/trapping-rain-water/description/" rel="nofollow">42. 接雨水

  • 注意 python 数组反序用法 result [::-1]
class Solution:
    def trap(self, height: List[int]) -> int:
        # n = len(height)
        # leftMax, rightMax = [0] * n, [0] * n
        # result = 0

        # leftMax[0] = height[0]
        # for i in range(1, n):
        #     leftMax[i] = max(leftMax[i-1], height[i])
        
        # rightMax[n-1] = height[n-1]
        # for i in range(n-2, 0, -1):
        #     rightMax[i] = max(rightMax[i+1], height[i])
        
        # for i in range(1, n):
        #     sum_i = min(leftMax[i], rightMax[i])- height[i]
        #     result += sum_i
        # return result

        # 递减的,当遇到比栈顶大的,即代表遇到凹槽,弹出计算,还是存 index
        stack = [0]
        result = 0

        for i in range(1, len(height)):
            if height[i] < height[stack[-1]]:
                stack.append(i)
            elif height[i] == height[stack[-1]]:
                stack.pop()
                stack.append(i)
            else:
                while len(stack) > 0 and height[i] > height[stack[-1]]:
                    mid_height = height[stack[-1]]
                    stack.pop()
                    if stack:
                        right_height = height[i]
                        left_height = height[stack[-1]]
                        h = min(right_height, left_height) - mid_height
                        w = i - stack[-1] -1
                        result += h*w
                stack.append(i)
        return result

leetcode.cn/problems/largest-rectangle-in-histogram/description/" rel="nofollow">84. 柱状图中最大的矩形

  • 双指针:记录左右侧第一个小于当前高度的下标(超时),最左侧和最右侧的处理也不同
  • 单调栈:注意要在首尾加入0,0,因为不同于接雨水,可以单独成一个矩形
class Solution:
    def largestRectangleArea(self, heights: List[int]) -> int:
        # n = len(heights)
        # # 左右侧第一个小于当前高度的下标
        # left_min, right_min = [0] * n, [0] * n
        # result = 0

        # left_min[0] = -1
        # for i in range(1, n):
        #     j = i - 1
        #     while j >= 0 and heights[j] >= heights[i]:
        #         j -= 1
        #     left_min[i] = j

        # right_min[n-1] = n
        # for i in range(n-2, -1, -1):
        #     j = i + 1
        #     while j < n and heights[j] >= heights[i]:
        #         j += 1
        #     right_min[i] = j
            
        # for i in range(0, len(heights)):
        #     tmp = heights[i] * (right_min[i] - left_min[i] - 1)
        #     result = max(tmp, result)
        
        # return result

        heights.insert(0, 0)
        heights.append(0)
        n = len(heights)
        # 递增,存下标
        stack = [0]
        result = 0

        for i in range(1, n):
            if heights[i] > heights[stack[-1]]:
                stack.append(i)
            elif heights[i] == heights[stack[-1]]:   # 相同高度只需要保留更右边的
                stack.pop()
                stack.append(i)
            else:
                # 较高的柱子都要一起处理
                while stack and heights[i] < heights[stack[-1]]:
                    mid_index = stack[-1]
                    stack.pop()
                    if stack:
                        left_index = stack[-1]
                        right_index = i
                        width = right_index - left_index - 1
                        result = max(result, width*heights[mid_index])
                stack.append(i)
        return result

http://www.niftyadmin.cn/n/5538854.html

相关文章

第二节:如何使用thymeleaf渲染html(自学Spring boot 3.x的第一天)

大家好&#xff0c;我是网创有方&#xff0c;今天来学习如何使用thymeleaf渲染html。该模板运用不广泛&#xff0c;所以本节内容了解既可。 第一步&#xff1a;创建html文件。 在模板templates目录下创建一个html文件。 编写代码如下&#xff1a; <!DOCTYPE html> <…

nRF Connect SDK v2.6.1 DFU 配置(由 SDK v2.1.0 迁移)

nRF Connect SDK v2.6.1 DFU 1. 参考&#xff1a;Add DFU support to your application2. 配置原有的旧porject 1. 参考&#xff1a;Add DFU support to your application Add DFU support to your application 首先我们使用SDK v2.6.1新建一个project&#xff0c;请根据上述…

Vue 邮箱登录界面

功能 模拟了纯前端的邮箱登录逻辑 还没有连接后端的发送邮件的服务 后续计划&#xff0c;再做一个邮箱、密码登录的界面 然后把这两个一块连接上后端 技术介绍 主要介绍绘制图形人机验证乃个 使用的是canvas&#xff0c;在源码里就有 界面控制主要就是用 表格、表单&#x…

从海上长城到数字防线:视频技术在海域边防现代化中的创新应用

随着全球化和科技发展的加速&#xff0c;海域安全问题日益凸显其重要性。海域边防作为国家安全的第一道防线&#xff0c;其监控和管理面临着诸多挑战。近年来&#xff0c;视频技术的快速发展为海域边防场景提供了新的解决方案&#xff0c;其高效、实时、远程的监控特点极大地提…

软件测试面试题总结(超全的)

前面看到了一些面试题&#xff0c;总感觉会用得到&#xff0c;但是看一遍又记不住&#xff0c;所以我把面试题都整合在一起&#xff0c;都是来自各路大佬的分享&#xff0c;为了方便以后自己需要的时候刷一刷&#xff0c;不用再到处找题&#xff0c;今天把自己整理的这些面试题…

【nms浅显易懂】

NMS非极大值抑制&#xff08;Non-Maximum Suppression, NMS&#xff09;是一种常用的后处理技术&#xff0c;用于目标检测算法中以减少冗余检测框并确保检测结果的精确性。NMS的主要目标是在同一物体上保留一个最佳的检测框&#xff0c;同时抑制那些得分较低的重叠框。下面是NM…

Qt之Pdb生成及Dump崩溃文件生成与调试(含注释和源码)

文章目录 一、Pdb生成及Dump文件使用示例图1.Pdb文件生成2.Dump文件调试3.参数不全Pdb生成的Dump文件调试 二、个人理解1.生成Pdb文件的方式2.Dump文件不生产的情况 三、源码Pro文件mian.cppMainWindowUi文件 总结 一、Pdb生成及Dump文件使用示例图 1.Pdb文件生成 下图先通过…

scipy optimze求解矩阵

☆ 问题描述 Trec PD&#xff0c;T是一个(81,128)的矩阵&#xff0c;rec是一个(128,1)的向量&#xff0c;PD是一个(81,1)的向量&#xff0c;现在rec和PD是一个已知的数&#xff0c;T有一个初始值&#xff0c;我想要你优化T使得等式成立 ★ 解决方案 import numpy as np from …