当前位置: 首页 > article >正文

接雨水-力扣热题100

题目:

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

示例 1:

img

 输入:height = [0,1,0,2,1,0,1,3,2,1,2,1]
 输出:6
 解释:上面是由数组 [0,1,0,2,1,0,1,3,2,1,2,1] 表示的高度图,在这种情况下,可以接 6 个单位的雨水(蓝色部分表示雨水)。 

示例 2:

 输入:height = [4,2,0,3,2,5]
 输出:9

分析:

这道题其实画图什么的分析下来就一个公式:

当前柱子能接水的值=min(左边柱子最高值,右边柱子最高值)−当前柱子的值

让两个指向数组的left和right这两个变量即这两个指针在不相遇的时候就说明中间还有柱子没有计算,一直到两个指针相遇,那么就说明所有柱子都计算了,程序结束就好。

核心思想就是利用两个指针从两端向中间遍历,同时维护两个变量来记录从左到右和从右到左遍历时遇到的最大高度。对于数组中的每一个柱子,其能接的雨水量可以通过比较它与左侧和右侧最大高度的最小值来确定。

这是一个难度稍稍中等偏上的题目。

难点还是在于理解,只要理解了代码其实很简单。

我用的双指针法,还有栈的方法等,我感觉双指针法比较简单易于理解。

具体步骤如下:

1.初始化两个指针 left 和 right 分别指向数组的起始和结束位置,同时初始化两个变量 left_max 和 right_max 为数组的第一个和最后一个元素的高度。

2.当 left < right 时,执行以下操作:

如果 height[left] < height[right],则更新 left_max 为 max(left_max, height[left]),然后计算 left 位置的雨水量并累加到总雨水量中,接着将 left 指针向右移动。

如果 height[left] >= height[right],则更新 right_max 为 max(right_max, height[right]),然后计算 right 位置的雨水量并累加到总雨水量中,接着将 right 指针向左移动。

  1. 重复步骤2,直到 left 和 right 相遇。

 class Solution {
     public int trap(int[] height) {
         //难在理解,有个公式:
         //每个柱子能接的水的值=min(左边柱子最高值,右边柱子最高值)-当前柱子的值
         if (height == null || height.length == 0)
             return 0;
         int left = 0;
         int right = height.length - 1;
         int left_max=0,right_max=0;
         int water = 0;
 ​
         while(left<right){
             if(height[left]<height[right]){
                 left_max = Math.max(left_max,height[left]);
                 water+=left_max-height[left];
                 left++;
             }else{
                 right_max = Math.max(right_max,height[right]);
                 water+=right_max-height[right];
                 right--;
             }
         }
         return water;
     }
 }

运行结果:


http://www.kler.cn/a/463314.html

相关文章:

  • Oracle ASM命令行工具asmcmd命令及其使用方法
  • 多层设计模式:可否设计各层之间公用的数据定义模块?
  • 如何使用Python自动化发送消息:用pynput库批量输入并发送文本
  • .net core 线程锁,互斥锁,自旋锁,混合锁
  • SpringBoot异步线程@Async的使用注意
  • 三维场景重建3D高斯点渲染复现
  • 使用 Jenkins 和 Spring Cloud 自动化微服务部署
  • 可编辑31页PPT | 大数据湖仓一体解决方案
  • 华为研发工程师编程题——明明的随机数
  • Win32汇编学习笔记01.环境配置
  • Apache Hive常见问题
  • 【网络】HTTP/1.0、HTTP/1.1、HTTP/2、HTTP/3比对
  • Keepalived + LVS 搭建高可用负载均衡及支持 Websocket 长连接
  • 【深度学习】Java DL4J基于 CNN 构建车辆识别与跟踪模型
  • Vue3 中的计算属性和监听属性
  • Unity3D Huatuo之AOT泛型限制及原理详解
  • 【Unity3D】A*寻路(2D究极简单版)
  • UWB定位的7种算法
  • YOLOv10-1.1部分代码阅读笔记-block.py
  • Unity-Mirror网络框架-从入门到精通之Basic示例
  • 低空经济服务线路,无人机建筑工地吊运技术详解
  • C中如何实现斐波那契数列的迭代和递归算法?
  • echo vim cat 与 换行符
  • SSRF服务端请求Gopher伪协议白盒测试
  • http性能测试命令ab
  • Sqoop的使用