力扣之接雨水(42)

ops/2024/10/20 2:35:33/

刷题不在多,而在精。

这道题号称字节的保洁阿姨都能做出的。

方法一:动态规划

下面这幅图简直封神,看了下图我才做出来的。

 两个方向遍历,然后取相同覆盖值-原始值(heigth数组)

这种方法更好理解。但是也有点难想出来。   可以想象吹风,被墙挡住了后面的沙子也和山那么高

从两头吹,然后能留下来的减去 里面坚硬的石头就是能装沙子的总容量了

 public static int trap(int[] height) {int []left=new int[height.length];int []right=new int[height.length];int left_max=0;int right_max=0;int n=height.length;for (int i = 0; i <n ; i++) {//从左向右遍历left_max=Math.max(height[i],left_max);left[i]=left_max;//从右向左right_max=Math.max(height[n-1-i],right_max);right[n-i-1]=right_max;}int result=0;for(int i=0;i<n;i++){int t=Math.min(left[i],right[i]);result+=t-height[i];}return result;}

方法二:双指针法

我对这种方法有点印象,但是还是忘了具体的做法。二刷之后茅塞顿开。

这种方法比方法一更难理解,但是更高效,时间复杂度来到了O(1)

维护两个指针 left 和 right,以及两个变量 leftMax 和 rightMax,初始时 left=0,right=n−1,leftMax=0,rightMax=0。指针 left 只会向右移动,指针 right 只会向左移动,在移动指针的过程中维护两个变量 leftMax 和 rightMax 的值。

当两个指针没有相遇时,进行如下操作:

使用 height[left] 和 height[right] 的值更新 leftMax 和 rightMax 的值;

如果 height[left]<height[right],并且height[left]<leftMax,下标 left 处能接的雨水量等于 leftMax−height[left],将下标 left 处能接的雨水量加到能接的雨水总量,然后将 left 加 1(即向右移动一位);

如果 height[left]≥height[right],并且height[right]<rightMax,下标 right 处能接的雨水量等于 rightMax−height[right],将下标 right 处能接的雨水量加到能接的雨水总量,然后将 right 减 1(即向左移动一位)。

当两个指针相遇时,即可得到能接的雨水总量。

想象一下,你是左指针,右边的那位比你高,而你不是左边最高的,你后面还有大山,是不是一下雨你就一定能乘到水。即使你和你左边的一样高,那顶多乘水为0嘛。如果你比左边的还高的话,你这个位置就乘不到水了。

public static int trap(int[] height) {int left_max=0,right_max=0;int left=0,right=height.length-1;int result=0;//总共装水量while(left!=right){if(height[left]<height[right]){//如果左边小于右边,如果左边的值 <左最大值 证明可以装水if(height[left]<left_max){result+=left_max-height[left];}else{left_max=height[left];}left++;}else{//如果左边大于右边,如果右边的值 <右最大值 证明可以装水if(height[right]<right_max){result+=right_max-height[right];}else{right_max=height[right];}right--;}}return result;}


http://www.ppmy.cn/ops/126870.html

相关文章

基础算法(6)——模拟

1. 替换所有的问号 题目描述&#xff1a; 算法思路&#xff1a; 从前往后遍历整个字符串&#xff0c;找到问号之后&#xff0c;尝试用 a ~ z 的每一个字符替换即可 注意点&#xff1a;需考虑数组开头和结尾是问号的边界情况 代码实现&#xff1a; class Solution {public …

网易翻译工具解析!这几大翻译器值得一试!

翻译工具的出现&#xff0c;使得跨语言沟通变得更加便捷。本文将为您推荐几款优秀的翻译工具&#xff0c;包括福昕在线翻译、福昕翻译客户端、海鲸AI翻译和网易有道翻译&#xff0c;帮助您在学习、工作和生活中轻松应对语言挑战。 福昕在线翻译 直达链接&#xff08;复制到浏…

打造高性能在线电子表格:WebGL 渲染引擎 Kola2d 自研之路

导读&#xff1a;本文主要阐述了 Docs 在线表格为打造极致渲染性能所做的关键优化和过程思考&#xff0c;作为首个在在线电子表格领域自研基于WebGL渲染引擎的「吃螃蟹」者&#xff0c;整个过程面临诸多不确定性与挑战&#xff0c;Kola2d 的整体设计在此期间也经历了几轮推倒重…

为笔杆注入“AI能量”,开启公文写作的新奇之旅

随着人工智能技术的进步与革新&#xff0c;应用场景不断拓展&#xff0c;AI已逐渐在公文写作领域崭露头角&#xff0c;它不仅可以提升写作效率&#xff0c;还能够优化内容质量&#xff0c;为公文写作赋予新的活力与可能性&#xff0c;成为公文写作的有效工具。 与传统的人工撰…

【如何获取股票数据10】Python、Java等多种主流语言实例演示获取股票行情api接口之沪深A股历史分时KDJ数据获取实例演示及接口API说明文档

最近一两年内&#xff0c;股票量化分析逐渐成为热门话题。而从事这一领域工作的第一步&#xff0c;就是获取全面且准确的股票数据。因为无论是实时交易数据、历史交易记录、财务数据还是基本面信息&#xff0c;这些数据都是我们进行量化分析时不可或缺的宝贵资源。我们的主要任…

Spring Boot 核心理解-自动装配

自动装配 spring boot的自动装配&#xff08;auto configuration&#xff09;是通过spring framework的依赖注入&#xff08;dependency injection, DI&#xff09;和配置类的组合来实现的。 spring boot 的自动装配机制可以简化应用的配置过程&#xff0c;是开发者不再需要手…

k8s权限控制RBAC中的clusterrole serviceaccount rolebinding 有什么作用

在 Kubernetes 的权限控制模型中,RBAC(基于角色的访问控制,Role-Based Access Control)用于管理对集群资源的访问权限。ClusterRole、ServiceAccount 和 RoleBinding 是其中的关键概念。下面是它们的作用: 1. ClusterRole 作用: ClusterRole 定义了一组权限(可以访问或操…

【数字图像处理】第5章 图像空域增强方法

上理考研周导师的哔哩哔哩频道 我在频道里讲课哦 目录 5.1 图像噪声 相关概念 ①图像噪声的产生 ② 图像噪声分类 ③ 图像噪声特点 5.2 图像增强方法分类 ①图像增强概念 ②图像增强目的 ③图像增强技术方法: 5.3 基于灰度变换的图像增强 1. 概述: 2. 灰度变换…