【LeetCode刷题笔记(8-3)】【Python】【接雨水】【双指针】【困难】

文章目录

  • 引言
  • 接雨水
    • 题目描述
    • 提示
  • 解决方案3:【双指针】
  • 结束语

接雨水

【LeetCode刷题笔记(8-1)】【Python】【接雨水】【动态规划】【困难】

【LeetCode刷题笔记(8-2)】【Python】【接雨水】【单调栈】【困难】

引言

编写通过所有测试案例的代码并不简单,通常需要深思熟虑理性分析。虽然这些代码能够通过所有的测试案例,但如果不了解代码背后的思考过程,那么这些代码可能并不容易被理解和接受。我编写刷题笔记的初衷,是希望能够与读者们分享一个完整的代码是如何在逐步的理性思考下形成的。我非常欢迎读者的批评和指正,因为我知道我的观点可能并不完全正确,您的反馈将帮助我不断进步。如果我的笔记能给您带来哪怕是一点点的启示,我也会感到非常荣幸。同时,我也希望我的分享能够激发您的灵感和思考,让我们一起在编程的道路上不断前行~

接雨水

题目描述

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

在这里插入图片描述
图片来源

提示

  • n == height.length
  • 1 <= n <= 2 * 104
  • 0 <= height[i] <= 105

解决方案3:【双指针】

在【LeetCode刷题笔记(8-1)】【Python】【接雨水】【动态规划】【困难】和【LeetCode刷题笔记(8-2)】【Python】【接雨水】【单调栈】【困难】中,我们详细阐述了如何在一步步理性分析下基于【动态规划】和【单调栈】设计完整的算法和代码通过接雨水的所有测试用例。这两种算法的空间复杂度都是O(n),其中动态规划法需要额外维护两个长度为N的数组left_max_listright_max_list,用于记录每个位置i ,其左侧柱子的最大高度left_max_list[i]和右侧柱子的最大高度right_max_list[i]

具体来说,我们首先从左到右完整地遍历数组height得到left_max_list,然后再从右往左完整地遍历数组height得到right_max_list。实际上,这相当于把【接雨水】问题的解决策略分成两个相对独立的步骤:

  1. 获取每个位置i ,其左侧和右侧柱子的最大高度。这一步需要两个for循环,分别从左到右和从右到左遍历数组。

  2. 根据木桶原理,以及步骤1获取的必要信息,得到最终的雨水总量。这一步还需要一个for循环,遍历整个数组。

问题1:有没有其它策略能够把步骤一和步骤二结合起来,即在一个循环下解决【接雨水】问题?

有,双指针。

在上面的分析过程中,我们发现步骤1的两个循环,一个是从左往右,一个是从右往左,这种遍历方法和双指针非常类似。因此,我们考虑是否可以用左指针替代从左往右的循环,同时用右指针替代从右往左的循环。这样,我们可以在一次遍历中完成两个步骤,提高算法的效率。

不仅可以,而且还买一送一,顺带解决了获取位置i雨水量的问题。

1. 当左指针left从左往右的移动过程中,我们可以通过left_max记录区间[0,left]的最大高度 。同理,当右指针right从右往左的移动过程中,我们也可以通过right_max记录区间[right,n-1]的最大高度。

关键问题2:如何决定下一步是移动左指针还是右指针?

当能确定位置left的接水量时,left右移;当能确定位置right的接水量时,right左移;

对于当前左指针的位置left,[0, left]区间的最大高度left_max是已知的,并且[right,n-1]区间的最大高度right_max也是已知的。根据木板原理,一个木桶的装水量总是受限于其最短的那块木板 ⇒ 此时left_max<right_max成立 ⇒ [0, left]的最高左木板 < [right, n-1]区间的最高右木板 <= [left+1, n-1]区间的最高右木板 恒成立⇒ 位置left的装水量由[0, left]的最高左木板决定,而[0, left]的最高左木板已经是板上钉钉 ⇒ 自然可以计算位置left的接水量water_left = left_max - height[left];既然位置left的接水量已经确定,下一步自然是left右移。

同理,对于当前右指针的位置right,[0, left]区间的最大高度left_max是已知的,并且[right,n-1]区间的最大高度right_max也是已知的 ⇒ 此时right_max < left_max成立 ⇒ [right, n-1]区间的最高右木板 < [0, left]的最高左木板 <= [0,right-1]区间的最高左木板 恒成立⇒ 位置right的装水量由 [right, n-1]区间的最高右木板决定,而 [right, n-1]区间的最高右木板的值已经是板上钉钉 ⇒ 自然可以计算位置right的接水量water_right = right_max - height[right];既然位置right的接水量已经确定,下一步自然是right左移。

完整代码如下

class Solution:  def trap(self, height: List[int]) -> int:  # 初始化结果为0  total_water = 0  # left指向数组的起始位置  left = 0  # right指向数组的末尾位置  right = len(height) - 1  # left_max记录从左到left的最大高度  left_max = 0  # right_max记录从right到数组末尾的最大高度  right_max = 0  # 当left小于right时,持续进行以下操作  while left < right:  # 更新left_max为当前left位置的高度和left_max中的较大值  left_max = max(left_max, height[left])  # 更新right_max为当前right位置的高度和right_max中的较大值  right_max = max(right_max, height[right])  if left_max < right_max:  # left_max小于right_max ==> 依据木桶原理 ==> 位置left雨水量由左木板最大高度和位置left的柱子高度共同确定  total_water += left_max - height[left]  # 向右移动left  left += 1  else:  # right_max大于等于left_max ==> 依据木桶原理 ==> 位置right的雨水量由左木板最大高度和位置left的柱子高度共同确定  total_water += right_max - height[right]  # 向左移动right  right -= 1  # 返回最终的雨水量  return total_water

运行结果
在这里插入图片描述

复杂度分析

  • 时间复杂度:O(N),其中 N 是数组height元素的数量。
  • 空间复杂度:O(1)
    • 利用双指针动态记录区间[0, left] 和[right, N-1]的最大值 ===> O(1)

结束语

  • 亲爱的读者,感谢您花时间阅读我们的博客。我们非常重视您的反馈和意见,因此在这里鼓励您对我们的博客进行评论。
  • 您的建议和看法对我们来说非常重要,这有助于我们更好地了解您的需求,并提供更高质量的内容和服务。
  • 无论您是喜欢我们的博客还是对其有任何疑问或建议,我们都非常期待您的留言。让我们一起互动,共同进步!谢谢您的支持和参与!
  • 我会坚持不懈地创作,并持续优化博文质量,为您提供更好的阅读体验。
  • 谢谢您的阅读!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/230713.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Arcgis新建矢量并手动绘制范围

新建一个shapefile&#xff0c;并选择面 得到了一个新shape 然后右击&#xff0c;开始编辑&#xff0c;打开编辑器

issue queue的实现方式

主要从一下几个点进行考虑&#xff1a; 集中式&#xff08;Centrallized&#xff09;或者分布式(Distributed)&#xff1b;压缩式&#xff08;Compressing&#xff09;或者非压缩式(Non-compressing)&#xff1b;数据捕捉的方式&#xff08;Data-capture&#xff09;或者非数据…

matlab中Signal Builder模块的用法总结

目录 前言方法一方法二参考文章 前言 今天在用matlab中Signal Builder的模块时&#xff0c;不知道怎么去得到想要的信号源&#xff0c;于是上网查了一下&#xff0c;并记录一下 方法一 如图所示&#xff0c;打开自定义 上面一行是横坐标&#xff0c;下面一行是纵坐标 [0,1…

.NET 自定义中间件 判断是否存在 AllowAnonymousAttribute 特性 来判断是否需要身份验证

public Task InvokeAsync(HttpContext context){// 获取终点路由特性var endpointFeature context.Features.Get<IEndpointFeature>();// 获取是否定义了特性var attribute endpointFeature?.Endpoint?.Metadata?.GetMetadata<AllowAnonymousAttribute>();if …

二叉树题目:二叉树着色游戏

文章目录 题目标题和出处难度题目描述要求示例数据范围 解法思路和算法代码复杂度分析 题目 标题和出处 标题&#xff1a;二叉树着色游戏 出处&#xff1a;1145. 二叉树着色游戏 难度 6 级 题目描述 要求 两位玩家参与二叉树着色游戏。给定二叉树的根结点 root \textt…

【稳定检索|投稿优惠】2024年公共服务、健康与医药国际会议(ICPSHM 2024)

2024年公共服务、健康与医药国际会议(ICPSHM 2024) 2024 International Conference on Public Services, Health, and Medicine(ICPSHM) 一、【会议简介】 ​2024年公共服务、健康与医药国际会议&#xff08;ICPSHM 2024&#xff09;将于三亚这片美丽的海滨城市盛大召开。我们诚…

UDP特性之组播(多播)

UDP特性之组播 1. 组播的特点2. 设置主播属性2.1 发送端2.2 接收端 3. 组播通信流程3.1 发送端3.2 接收端 4. 通信代码 原文链接 在公司测试广播和多播有一点问题。。。 1. 组播的特点 组播也可以称之为多播这也是UDP的特性之一。组播是主机间一对多的通讯模式&#xff0c;是…

SHT10温湿度传感器——STM32驱动

———————实验效果——————— &#x1f384;硬件外观 &#x1f384;接线 &#x1f388; 3.3V供电 &#x1f388; IIC通讯 &#x1f384; 代码获取 &#x1f388; 查看下方 ———————END———————

20231218在微软官网下载WINDOWS10以及通过rufus-4.3p写入U盘作为安装盘

20231218在微软官网下载WINDOWS10以及通过rufus-4.3p写入U盘作为安装盘 2023/12/18 17:06 百度搜索&#xff1a;下载 windows10 https://www.microsoft.com/zh-cn/software-download/windows10 下载 Windows 10 更新之前&#xff0c;请参阅 Windows 版本信息状态中的已知问题&a…

系统设计——系统安全

HTTPS 是如何工作的&#xff1f; 安全超文本传输​​协议&#xff08;HTTPS&#xff09;是超文本传输​​协议&#xff08;HTTP&#xff09;的扩展。HTTPS 使用传输层安全性&#xff08;TLS&#xff09;传输加密数据。如果数据在网上被劫持&#xff0c;劫持者得到的只是二进制…

TaxtArea中内嵌一张放松图片,该图片实现属性悬浮放大功能

TaxtArea中内嵌一张发送图片&#xff0c;该图片实现属性悬浮放大功能&#xff0c;离开还原效果&#xff0c;点击发送按钮后&#xff0c;发送图片变为loading&#xff0c; <div class"textarea-wrapper" ><a-textarearef"textArea"v-model.trim&q…

web应用开发技术的一些概念

一、Servlet 1.Servlet的工作过程&#xff1a; Servelt的工作流程示意图 &#xff08;1&#xff09;客户端发起一个Http请求到服务器&#xff0c;请求特定的资源或者是要执行特定的操作 &#xff08;2&#xff09;服务器在接收到请求后&#xff0c;根据请求相应的URL将请求分发…

21、同济、微软亚研院、西安电子科技大提出HPT:层次化提示调优,独属于提示学习的[安妮海瑟薇]

前言&#xff1a; 本论文由同济大学、微软亚洲研究院、西安电子科技大学&#xff0c;于2023年12月11日中了AAAI2024 论文&#xff1a; 《Learning Hierarchical Prompt with Structured Linguistic Knowledge for Vision-Language Models》 地址&#xff1a; [2312.06323]…

C++泛型超详细合集-泛化的编程方式-程序员编写一个函数/类的代码让编译器去填补出不同的函数实现-供大家学习研究参考

以Add函数为例&#xff0c;在函数模板存在的同时&#xff0c;我们还可以单独写一个int类型的add函数。这都归功于函数重载的存在。 同时&#xff0c;我们还可以使用<int>来指定函数模板重载为已存在的Add函数。因为本质上这两个函数是不同的&#xff0c;并不会冲突。 下…

猫粮哪个牌子好又安全?好又安全的主食冻干猫粮牌子推荐

现在越来越多的铲屎官关注猫咪的食品选择&#xff0c;而冻干猫粮一直是热门话题。其中主食冻干的肉含量很高&#xff0c;富含猫咪成长所需的蛋白质、维生素等营养物质。而且冻干工艺还保留了食材的原始风味&#xff0c;复水后可以恢复鲜肉的口感&#xff0c;猫咪很喜欢吃&#…

人工智能Keras图像分类器(CNN卷积神经网络的图片识别篇)

上期文章我们分享了人工智能Keras图像分类器(CNN卷积神经网络的图片识别的训练模型),本期我们使用预训练模型对图片进行识别:Keras CNN卷积神经网络模型训练 导入第三方库 from keras.preprocessing.image import img_to_array from keras.models import load_model impor…

关于“Python”的核心知识点整理大全27

目录 10.5 小结 第&#xff11;1 章 测试代码 11.1 测试函数 name_function.py 函数get_formatted_name()将名和姓合并成姓名&#xff0c;在名和姓之间加上一个空格&#xff0c;并将它们的 首字母都大写&#xff0c;再返回结果。为核实get_formatted_name()像期望的那样工…

arcgis javascript api4.x加载天地图cgs2000坐标系

需求&#xff1a;arcgis javascript api4.x加载天地图cgs2000坐标系 效果&#xff1a; 示例代码&#xff1a; <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"wid…

Python爬虫-解决使用requests,Pyppeteer,Selenium遇到网站显示“您的连接不是私密连接”的问题|疑难杂症解决(2)

前言 本文是该专栏的第13篇,后面会持续分享python爬虫案例干货,记得关注。 相信很多同学在处理爬虫项目的时候,会遇到一些网站出现如下图所示的情况: 就是当你不论是使用requests进行协议请求,还是使用自动化框架pyppeteer或者selenium都会出现上图中的情况。这相信会或多…

年度大盘点:AIGC、AGI、GhatGPT震撼登场!揭秘人工智能大模型的奥秘与必读书单

这里写目录标题 前言01 《ChatGPT 驱动软件开发》02 《ChatGPT原理与实战》03 《神经网络与深度学习》04 《AIGC重塑教育》05 《通用人工智能》 前言 在2023年&#xff0c;人工智能领域经历了一场前所未有的大爆发&#xff0c;特别是在语言模型领域。新的概念和英文缩写如AIGC、…