代码随想录算法训练营第六十二、六十三天 | 单调栈 part 2 | 503.下一个更大元素II 、42. 接雨水、84.柱状图中最大的矩形

本文主要是介绍代码随想录算法训练营第六十二、六十三天 | 单调栈 part 2 | 503.下一个更大元素II 、42. 接雨水、84.柱状图中最大的矩形,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

  • 503.下一个更大元素II
    • 思路
    • 代码
  • 42. 接雨水
    • 思路一 双指针
    • 思路二 单调栈
    • 代码
  • 84.柱状图中最大的矩形
    • 思路一 双指针
    • 思路二 单调栈
    • 代码

503.下一个更大元素II

Leetcode
在这里插入图片描述

思路

将数组乘2来遍历即可,就是加长版的每日温度。

但是处理起来会有细节,如果只是单纯数组乘二,最后返回的时候还需要返回数组的一半大小,空间上不是很划算。

其实不需要扩大数组,只需要在遍历的时候,遍历长度为2*len(nums), 然后nums[i % len(nums)]即可。

代码

数组乘2

class Solution:def nextGreaterElements(self, nums: List[int]) -> List[int]:nums = nums + numsres = [-1] * len(nums)stack = [0]for i in range(1, len(nums)):if nums[i] <= nums[stack[-1]]:stack.append(i)else:while stack and nums[i] > nums[stack[-1]]:res[stack[-1]] = nums[i]stack.pop()stack.append(i)return res[:len(nums)//2]

遍历长度为2*len(nums)

class Solution:def nextGreaterElements(self, nums: List[int]) -> List[int]:dp = [-1] * len(nums)stack = []for i in range(len(nums)*2):while(len(stack) != 0 and nums[i%len(nums)] > nums[stack[-1]]):dp[stack[-1]] = nums[i%len(nums)]stack.pop()stack.append(i%len(nums))return dp

42. 接雨水

Leetcode
在这里插入图片描述

思路一 双指针

对于每一个柱子,用两个list分别存放左边最高的柱子,和右边最高的柱子。
在这里插入图片描述
列4 左侧最高的柱子是列3,高度为2(以下用lHeight表示)。

列4 右侧最高的柱子是列7,高度为3(以下用rHeight表示)。

列4 柱子的高度为1(以下用height表示)

那么列4的雨水高度为 列3和列7的高度最小值减列4高度,即: min(lHeight, rHeight) - height。

在有了rHeight和lHeight的情况下,遍历所以的柱子,求出雨水体积即可。

思路二 单调栈

单调栈按照行方向来计算雨水体积
在这里插入图片描述

代码

双指针

class Solution:def trap(self, height: List[int]) -> int:lHeight, rHeight = [0] * len(height), [0] * len(height)lHeight[0] = height[0]for i in range(1, len(lHeight)):# 计算左边最高柱子的时候连自己也包括lHeight[i] = max(lHeight[i - 1], height[i])rHeight[-1] = height[-1]for i in range(len(rHeight) - 2, -1, -1):rHeight[i] = max(rHeight[i + 1], height[i])res = 0for i in range(len(height)):res += (min(rHeight[i], lHeight[i]) - height[i])return res

单调栈

class Solution:def trap(self, height: List[int]) -> int:stack = [0]result = 0for i in range(1, len(height)):while stack and height[i] > height[stack[-1]]:mid_height = stack.pop()if stack:# 雨水高度是 min(凹槽左侧高度, 凹槽右侧高度) - 凹槽底部高度h = min(height[stack[-1]], height[i]) - height[mid_height]# 雨水宽度是 凹槽右侧的下标 - 凹槽左侧的下标 - 1w = i - stack[-1] - 1# 累计总雨水体积result += h * wstack.append(i)return result

84.柱状图中最大的矩形

Leetcode

在这里插入图片描述

思路一 双指针

对于每一个柱子,用两个list分别存放左边第一个小于该柱子的下标,和右边第一个小于该柱子的下标

在有两个list的基础上,遍历heights,

res += heights[i] * (minRightIndex[i] - minLeftIndex[i] - 1)

思路二 单调栈

思路来源:neetcode

代码

单调栈

class Solution:def largestRectangleArea(self, heights: List[int]) -> int:maxArea = 0stack = []for i, h in enumerate(heights):start = iwhile stack and stack[-1][1] > h:index, height = stack.pop()maxArea = max(maxArea, height * (i - index))start = indexstack.append([start, h])for i, h in stack:maxArea = max(maxArea, h * (len(heights) - i))return maxArea

这篇关于代码随想录算法训练营第六十二、六十三天 | 单调栈 part 2 | 503.下一个更大元素II 、42. 接雨水、84.柱状图中最大的矩形的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/203742

相关文章

使用Dify访问mysql数据库详细代码示例

《使用Dify访问mysql数据库详细代码示例》:本文主要介绍使用Dify访问mysql数据库的相关资料,并详细讲解了如何在本地搭建数据库访问服务,使用ngrok暴露到公网,并创建知识库、数据库访... 1、在本地搭建数据库访问的服务,并使用ngrok暴露到公网。#sql_tools.pyfrom

Java springBoot初步使用websocket的代码示例

《JavaspringBoot初步使用websocket的代码示例》:本文主要介绍JavaspringBoot初步使用websocket的相关资料,WebSocket是一种实现实时双向通信的协... 目录一、什么是websocket二、依赖坐标地址1.springBoot父级依赖2.springBoot依赖

讯飞webapi语音识别接口调用示例代码(python)

《讯飞webapi语音识别接口调用示例代码(python)》:本文主要介绍如何使用Python3调用讯飞WebAPI语音识别接口,重点解决了在处理语音识别结果时判断是否为最后一帧的问题,通过运行代... 目录前言一、环境二、引入库三、代码实例四、运行结果五、总结前言基于python3 讯飞webAPI语音

什么是 Java 的 CyclicBarrier(代码示例)

《什么是Java的CyclicBarrier(代码示例)》CyclicBarrier是多线程协同的利器,适合需要多次同步的场景,本文通过代码示例讲解什么是Java的CyclicBarrier,感... 你的回答(口语化,面试场景)面试官:什么是 Java 的 CyclicBarrier?你:好的,我来举个例

如何通过Golang的container/list实现LRU缓存算法

《如何通过Golang的container/list实现LRU缓存算法》文章介绍了Go语言中container/list包实现的双向链表,并探讨了如何使用链表实现LRU缓存,LRU缓存通过维护一个双向... 目录力扣:146. LRU 缓存主要结构 List 和 Element常用方法1. 初始化链表2.

基于Canvas的Html5多时区动态时钟实战代码

《基于Canvas的Html5多时区动态时钟实战代码》:本文主要介绍了如何使用Canvas在HTML5上实现一个多时区动态时钟的web展示,通过Canvas的API,可以绘制出6个不同城市的时钟,并且这些时钟可以动态转动,每个时钟上都会标注出对应的24小时制时间,详细内容请阅读本文,希望能对你有所帮助...

HTML5 data-*自定义数据属性的示例代码

《HTML5data-*自定义数据属性的示例代码》HTML5的自定义数据属性(data-*)提供了一种标准化的方法在HTML元素上存储额外信息,可以通过JavaScript访问、修改和在CSS中使用... 目录引言基本概念使用自定义数据属性1. 在 html 中定义2. 通过 JavaScript 访问3.

Flutter监听当前页面可见与隐藏状态的代码详解

《Flutter监听当前页面可见与隐藏状态的代码详解》文章介绍了如何在Flutter中使用路由观察者来监听应用进入前台或后台状态以及页面的显示和隐藏,并通过代码示例讲解的非常详细,需要的朋友可以参考下... flutter 可以监听 app 进入前台还是后台状态,也可以监听当http://www.cppcn

Python使用PIL库将PNG图片转换为ICO图标的示例代码

《Python使用PIL库将PNG图片转换为ICO图标的示例代码》在软件开发和网站设计中,ICO图标是一种常用的图像格式,特别适用于应用程序图标、网页收藏夹图标等场景,本文将介绍如何使用Python的... 目录引言准备工作代码解析实践操作结果展示结语引言在软件开发和网站设计中,ICO图标是一种常用的图像

Java中有什么工具可以进行代码反编译详解

《Java中有什么工具可以进行代码反编译详解》:本文主要介绍Java中有什么工具可以进行代码反编译的相关资,料,包括JD-GUI、CFR、Procyon、Fernflower、Javap、Byte... 目录1.JD-GUI2.CFR3.Procyon Decompiler4.Fernflower5.Jav