[Leetcode] 接雨水(相向双指针)

embedded/2024/11/10 11:58:27/

可以直接移步大神的解题思路,非常详细 -> 盛最多水的容器 接雨水_哔哩哔哩_bilibili

11. 盛最多水的容器 https://leetcode.cn/problems/container-with-most-water/description/
42. 接雨水 https://leetcode.cn/problems/trapping-rain-water/description/

11. 盛最多水的容器

解题思路:求区域面积的最大值,矩形的面积取决于底和高,高度的最大值未知,底的最大值已知,所以可以从底边最大开始,即左右各一枚指针。而高度取决于更小的高度,提高更小的高度才有可能找到更大的面积,所以哪边低哪边的指针往中间走一步,如果面积更大则更新,直到左右指针相邻。

python">class Solution:def maxArea(self, height: List[int]) -> int:n = len(height)left = 0right = n-1maxarea = 0while left < right:area = min(height[left],height[right]) * (right - left)maxarea = max(maxarea,area)if height[left] < height[right]:left += 1else:right -= 1return maxarea

42.接雨水

想破了脑袋,把局部最大值都拿出来然后没有覆盖“高-低-高”这种情况,而低本身可以是各种组合,其实如果能想到一侧的最大值挡着水就不会流出去就思路通畅了,这样高度就取决于另一边。

解题思路:计算每个位置的水量,取决于往左边看最高的柱子高度,以及往右边看最高的柱子高度,两者之间的较小者。即使相邻的左(右)侧柱子更低,因为更左(右)侧有更高的柱子,水不会流出去。

方法一:前缀最大值列表和后缀最大值列表

创建一个前缀列表,for循环从左往右,记录每个位置左侧已出现过的柱子的最大高度;

创建一个后缀列表,for循环从右往左,记录每个位置右侧已出现过的柱子的最大高度;

在每个位置比较上述两个值谁更小,把该位置的水量加到总和中。

python">class Solution:def trap(self, height: List[int]) -> int:ans = 0n = len(height)pre_max = [0]*nsuf_max = [0]*npre_max[0] = height[0]suf_max[-1] = height[-1]for i in range(1,n):pre_max[i] = max(pre_max[i-1],height[i])for i in range(n-2,-1,-1):suf_max[i] = max(suf_max[i+1],height[i])for i in range(n):ans += min(pre_max[i],suf_max[i]) - height[i]### Or use zip()# for pre,suf,h in zip(pre_max,suf_max,height):#     ans += min(pre,suf) - hreturn ans

方法二:相向双指针

相比于方法一使用更少内存,不用两个列表,改用两个变量。

指针1从左往右,记录左半边已出现的最高柱子;

指针2从右往左,记录右半边已出现的最高柱子;

一开始,指针1在最左侧,指针2在最右侧,哪半边的最高柱子的高度更小则该位置水量高度已确定(另一侧的最大值保证了水不会流出去),水量记入总和,该侧指针往中间移动一步,就这样直到两边的指针重合。

python">class Solution:def trap(self, height: List[int]) -> int:ans = 0n = len(height)left = 0right = n-1pre_max = height[0]suf_max = height[-1]while left <= right:   pre_max = max(pre_max,height[left])suf_max = max(suf_max,height[right])if pre_max < suf_max:ans += pre_max - height[left]left += 1else:ans += suf_max - height[right]right -= 1return ans


http://www.ppmy.cn/embedded/107192.html

相关文章

python实现人工蜂群算法

博客目录 引言 什么是人工蜂群算法&#xff08;ABC&#xff09;&#xff1f;人工蜂群算法的应用场景为什么使用人工蜂群算法&#xff1f; 人工蜂群算法的原理 人工蜂群算法的基本概念人工蜂群算法的三种蜜蜂类型人工蜂群算法的流程人工蜂群算法的特点与优势 人工蜂群算法的实…

pytest二次开发:生成用例参数

pytest.fixture是一个装饰器&#xff0c;用于声明一个fixture。Fixture是pytest中的一个核心概念&#xff0c;它提供了一种将测试前的准备代码&#xff08;如设置测试环境、准备测试数据等&#xff09;和测试后的清理代码&#xff08;如恢复测试环境、删除临时文件等&#xff0…

STM32基础篇:RTC × Unix时间戳 × BKP

Unix时间戳 最早是在Unix系统使用的&#xff0c;之后很多由Unix演变而来的系统也都继承了Unix时间戳的规定。目前&#xff0c;Linux、Windows、安卓这些系统&#xff0c;其底层的计时系统都是使用Unix时间戳。 Uinx时间戳&#xff08;Unix Timestamp&#xff09;定义为从UTC/…

扑捉一只耿鬼(HTML文件)

图例&#xff1a; 代码&#xff1a; <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><title>耿鬼</title><style>body {background: #fff;font-family: Comfortaa, sans-serif;}* {box-sizing:…

滑动窗口序列(单序列双指针)9/5

一、不间断子数组(滑动窗口哈希表) 题意&#xff1a; 给你一个数组nums,现在求子数组中都有 0 < |nums[i1] - nums[i2]| < 2 。这样称一个不间断子数组。&#xff08;简而言之&#xff1a;子数组中最大值和最小值的差距必须<2&#xff09;。求不间断子数组的数量 输…

Android 14(API 级别 34)中,DexClassLoader 不再支持可写 dex/jar 文件

Android 14&#xff08;API 级别 34&#xff09;中&#xff0c;DexClassLoader 不再支持从可写文件加载 dex/jar 文件。这意味着从Android 14开始&#xff0c;你不能再使用 DexClassLoader 来动态加载位于内部存储中的dex/jar文件&#xff0c;除非这些文件被设置为只读。 解决…

2024国赛数学建模A题思路模型代码

2024国赛数学建模思路资料&#xff0c;思路获取见文末名片 数学建模感想 纪念逝去的大学数学建模&#xff1a;两次校赛&#xff0c;两次国赛&#xff0c;两次美赛&#xff0c;一次电工杯。从大一下学期组队到现在&#xff0c;大三下学期&#xff0c;时间飞逝&#xff0c;我的…

Unity数据持久化 之 二进制存储法

本文仅作笔记学习和分享&#xff0c;不用做任何商业用途 本文包括但不限于unity官方手册&#xff0c;unity唐老狮等教程知识&#xff0c;如有不足还请斧正​​ 前置知识&#xff1a;1 Byte 8 bit &#xff0c;所以0000 00001 就是一个字节&#xff0c; 该串数字转为十进制代表1…