首页 > 其他分享 >【刷题笔记】42. Trapping Rain Water

【刷题笔记】42. Trapping Rain Water

时间:2023-09-08 20:32:57浏览次数:48  
标签:right Trapping 42 高度 Rain height res left 指针

题目

Given n non-negative integers representing an elevation map where the width of each bar is 1, compute how much water it is able to trap after raining.

The above elevation map is represented by array [0,1,0,2,1,0,1,3,2,1,2,1]. In this case, 6 units of rain water (blue section) are being trapped. Thanks Marcos for contributing this image!

Example:

Input: [0,1,0,2,1,0,1,3,2,1,2,1]
Output: 6

题目大意

从 x 轴开始,给出一个数组,数组里面的数字代表从 (0,0) 点开始,宽度为 1 个单位,高度为数组元素的值。如果下雨了,问这样一个容器能装多少单位的水?

解题思路

  • 每个数组里面的元素值可以想象成一个左右都有壁的圆柱筒。例如下图中左边的第二个元素 1,当前左边最大的元素是 2 ,所以 2 高度的水会装到 1 的上面(因为想象成了左右都有筒壁)。这道题的思路就是左指针从 0 开始往右扫,右指针从最右边开始往左扫。额外还需要 2 个变量分别记住左边最大的高度和右边最大高度。遍历扫数组元素的过程中,如果左指针的高度比右指针的高度小,就不断的移动左指针,否则移动右指针。循环的终止条件就是左右指针碰上以后就结束。只要数组中元素的高度比保存的局部最大高度小,就累加 res 的值,否则更新局部最大高度。最终解就是 res 的值。
  • 抽象一下,本题是想求针对每个 i,找到它左边最大值 leftMax,右边的最大值 rightMax,然后 min(leftMax,rightMax) 为能够接到水的高度。left 和 right 指针是两边往中间移动的游标指针。最傻的解题思路是针对每个下标 i,往左循环找到第一个最大值,往右循环找到第一个最大值,然后把这两个最大值取出最小者,即为当前雨水的高度。这样做时间复杂度高,浪费了很多循环。i 在从左往右的过程中,是可以动态维护最大值的。右边的最大值用右边的游标指针来维护。从左往右扫一遍下标,和,从两边往中间遍历一遍下标,是相同的结果,每个下标都遍历了一次。
  • 每个 i 的宽度固定为 1,所以每个“坑”只需要求出高度,即当前这个“坑”能积攒的雨水。最后依次将每个“坑”中的雨水相加即是能接到的雨水数。

参考代码

package leetcode

func trap(height []int) int {
	res, left, right, maxLeft, maxRight := 0, 0, len(height)-1, 0, 0
	for left <= right {
		if height[left] <= height[right] {
			if height[left] > maxLeft {
				maxLeft = height[left]
			} else {
				res += maxLeft - height[left]
			}
			left++
		} else {
			if height[right] >= maxRight {
				maxRight = height[right]
			} else {
				res += maxRight - height[right]
			}
			right--
		}
	}
	return res
}

标签:right,Trapping,42,高度,Rain,height,res,left,指针
From: https://blog.51cto.com/u_16110811/7412885

相关文章

  • P4042 [AHOI2014/JSOI2014] 骑士游戏
    原题非常好的一道题,用到了一个重要的思路:消除\(dp\)的后效性不要觉得这个东西很恐怖,其实这个东西并不复杂,只是名字有点吓人我们容易想到对把原题抽象成一个图,我们容易想到如果该图为\(DAG\)我们要怎么做,直接拓扑上\(dp\)即可但回到原题,我们发现\(dp\)就有了一些问题:这个题是有......
  • CF 842 vp记录
    A诈骗题,看起来有点高大上,其实只要将\(k\)减\(1\)即可。B此时序列中的递增子序列是不需要移动的,所以此时本题就满足一个贪心,设不在这个递增子序列中的数的个数是\(x\),则答案为\(\lfloor\frac{x}{k}\rfloor\)C这破比赛怎么这么喜欢排列。此时这个排列满足三个性质。每个......
  • 论文解读(CST)《Cycle Self-Training for Domain Adaptation》
    Note:[wechat:Y466551|可加勿骚扰,付费咨询]论文信息论文标题:CycleSelf-TrainingforDomainAdaptation论文作者:HongLiu,JianminWang,MingshengLong论文来源:2021 论文地址:download 论文代码:download视屏讲解:click......
  • Proj CDeepFuzz Paper Reading: PELICAN: Exploiting Backdoors of Naturally Trained
    Abstract背景:本文研究的不是被恶意植入的后门,而是productsofdefectsintraining攻击模式:injectingsomesmallfixedinputpattern(backdoor)toinducemisclassification本文:PELICANGithub:https://github.com/ZhangZhuoSJTU/PelicanTask:findbackdoorvulne......
  • 【错误记录】Android Studio 创建 Module 模块报错 ( Cannot resolve external depend
    文章目录一、报错信息二、解决方案目前使用的是最新的Gradle配置,创建Module生成的源码与Gradle配置出现了冲突,导致的问题;解决此类问题,要仔细检查Gradle构建脚本,排查每个依赖库的来源;本次错误就是AS系统自动成的Module修改了Gradle构建脚本,导......
  • Django-SQL Injection Vulnerability (CVE-2019-14234)
    复现环境:Vulhub环境启动后,访问http://192.168.80.141:8000即可看到Django默认首页漏洞复现首先登陆后台http://192.168.80.141:8000/admin/,用户名密码为admin、a123123123。登陆后台后,进入模型Collection的管理页面http://192.168.80.141:8000/admin/vuln/collection/:然后......
  • MindSponge分子动力学模拟——Constraint约束
    技术背景在前面的几篇博客中,我们已经介绍了MindSponge的基本使用方法,比如定义一个分子系统、计算分子的单点能以及迭代器的使用等。有了这些基础的教程,用户以及可以执行一些比较简单的模拟任务,比如可以跑一个能量极小化,或者是NVT过程。当我们去执行一个模拟任务时,比较关键的一个......
  • 剑指 Offer 42. 连续子数组的最大和
    输入一个整型数组,数组中的一个或连续多个整数组成一个子数组。求所有子数组的和的最大值。要求时间复杂度为O(n)。 示例1:输入:nums=[-2,1,-3,4,-1,2,1,-5,4]输出:6解释:连续子数组[4,-1,2,1]的和最大,为6。classSolution{publicintmaxSubArray(int[]nums){......
  • 1142 Maximal Clique(附测试点1,3错误分析)
    题目:A clique isasubsetofverticesofanundirectedgraphsuchthateverytwodistinctverticesinthecliqueareadjacent.A maximalclique isacliquethatcannotbeextendedbyincludingonemoreadjacentvertex.(Quotedfromhttps://en.wikipedia.or......
  • 致远OA webmail.do 任意文件下载 CNVD-2020-62422
    漏洞描述致远OA存在任意文件下载漏洞,攻击者可利用该漏洞下载任意文件,获取敏感信息影响版本致远OAA6-V5致远OAA8-V5致远OAG6漏洞复现fofa语法:app="致远互联-OA"登录页面如下:致远OAwebmail.do文件读取漏洞,由于/seeyon/webmail.do页面filePath参数过滤不严,导致可以......