首页 > 其他分享 >7、双指针-接雨水

7、双指针-接雨水

时间:2024-04-06 17:59:58浏览次数:21  
标签:int 最大值 雨水 height length rightArr 指针

 按列求+辅助数组

  1. 只关注每一列 当前能够留下几滴雨水。0和末尾位置不用考虑,盛不了雨水。
  2. 现在 有个 0<i<length-1 位置,那么他能盛多少雨水呢?取决于左边最大值和右边最大值,Math.min(leftArr[i-1],rightArr[i+1])。再减去i位置的高度 就是可以盛的雨水,如果本身高度大于左右边最大值的最小值,那就是0。所以最终关系就是:Math.max(Math.min(leftArr[i-1],rightArr[i+1])-height[i],0)
  3. 这里i不断递增情况下需要重新算左右边最大值问题。可以做两个辅助数组leftArr表示左边最大值数组,rightArr表示右边最大值数组。

代码如下:

class Solution {
    public int trap(int[] height) {
        if (height==null||height.length<2){
            return 0;
        }
        int N=height.length;
        //建立辅助数组
        int[] leftArr=new int[N];
        int[] rightArr = new int[N];
        leftArr[0]=height[0];
        for (int i = 1; i < N; i++) {
            leftArr[i]=Math.max(leftArr[i-1],height[i]);
        }
        rightArr[N-1]=height[N-1];
        for (int i = N-2; i>=0; i--) {
            rightArr[i]= Math.max(height[i], rightArr[i + 1]);
        }
        int S=0;
        for (int i = 1; i < N-1; i++) {
            S+=Math.max(Math.min(leftArr[i-1],rightArr[i+1])-height[i],0);
        }
        return S;
    }
}

双指针

  1. 首先 0和length-1 位置不用计算,无法盛水。
  2. 现在L指针到1 R指针到length-2, lMax表示左侧最大值,rMax表示右侧最大值。
  3. 如果lMax<=rMax:说明 L左侧最大值是lMax,右侧最大值不知道,但是肯定是不小于rMax。并且有lMax<=rMax,漏桶效应,以左侧最大值为准,那就说明L位置可以结算了。
  4. 反之 右侧结算

代码如下:

class Solution {
    public int trap(int[] height) {
       if (height==null||height.length<2){
            return 0;
        }
        int N=height.length;
        int L=1;
        int R=N-2;
        int lMax=height[0];
        int rMax=height[N-1];
        int s=0;
        while (L<=R){
            if (lMax<=rMax){
                s+=Math.max(lMax-height[L],0);
                lMax=Math.max(lMax,height[L]);
                L++;
            }else {
                s+=Math.max(rMax-height[R],0);
                rMax=Math.max(rMax,height[R]);
                R--;
            }
        }
        return s;
    }
}

标签:int,最大值,雨水,height,length,rightArr,指针
From: https://blog.csdn.net/qq_29434541/article/details/137431561

相关文章

  • C++ this指针的概念和使用
    this指针的概念:在C++中成员变量和成员函数是分开存储的。每一个非静态成员函数只会诞生一份函数实例,也就是说多个同类型的对象会共用一块代码。那么问题是:这一块代码是如何区分哪个对象调用自己的呢?c++通过提供特殊的对象指针,this指针,解决上述问题。关键:this指针指向......
  • 深入理解指针(3)
    目录:1.指针数组2.指针数组模拟二维数组3.字符指针变量4.数组指针变量1.指针数组首先我们需要明确指针数组究竟是指针还是数组?指针数组是存放指针的数组,我们可以类比整型数组和字符数组如图所示指针数组的每个元素都是地址,又可以指向一块区域。2.指针数组模拟二......
  • 【C语言初阶】指针运算
    【C语言初阶】指针运算文章目录【C语言初阶】指针运算四、指针运算1介绍2指针+-整数2.1示例3指针-指针3.1示例3.2模拟实现`strlen()`3.2.1方法一:指针-指针3.2.2方法二:计数器3.2.3方法三:函数递归4指针的关系运算4.1示例14.2示例24.3标准规定总......
  • 【C语言初阶】指针
    【C语言初阶】指针文章目录【C语言初阶】指针一、指针是什么?1指针是什么?2内存2指针变量2.1示例2.2总结3如何编址?3.1编址3.1总结二、指针和指针类型1指针的类型1.1示例2指针+-整数2.1示例2.2总结3指针的解引用3.1示例3.2总结总结:本章目标:......
  • 《C++程序设计》阅读笔记【4-指针(2)】
    ......
  • c语言之多重指针
    多重指针是定义了一个指针a后,又定义一个指针b引用指针a的地址,就叫多重指针多重指针定义的方法:类型名**指针名#include<stdio.h>intmain(){ inta; a=3; int*p=&a; int**y=&p; printf("%d\n",a); printf("%d\n",*p); printf("%d\n",**y); return0;}上面代码......
  • c语言之指针数组
    在c语言中,一个数组元素是由指针组成的,就叫指针数组。指针数组的定义方法类型名*数组名[数组长度]如果要处理多个字符串,用指针数组会方便多。举个例子,代码如下#include<stdio.h>intmain(){ inti; char*s[]={"cprogram","control","logic"}; for(i=0;i<3;i++) ......
  • [C++][C++11][智能指针]分析详解 + 代码模拟
    目录0.智能指针三要素:)1.为什么需要智能指针?2.内存泄漏1.什么是内存泄漏?内存泄漏的危害?2.内存泄漏分类(了解)3.如何检测内存泄漏4.如何避免内存泄漏3.RAII4.智能指针原理5.auto_ptr(失败设计)6.unique_ptr7.shared_ptr1.实现原理:通过引用计数的方式来实现多个shared_ptr......
  • void类型指针
    void类型指针void指针是一种特殊的指针,表示为“无类型指针”,。由于void指针没有特定的类型,因此它可以指向任何类型的数据。也就是说,任何类型的指针都可以直接赋值给void指针,而无需进行其他相关的强制类型转换void*p1;int*p2;p1=p2;但是,将void指针赋值给......
  • 实验题集三:指针和引用 所有题
    R7-1冒泡鸿鸿哥最近学习了指针,感觉这个知识点有点难以理解,于是想要通过编程实践来掌握它。鸿鸿哥以前学习数组(第7章)的时候已经掌握了冒泡排序的一般写法,现在他想用指针来实现排序的功能函数。但是他遇到了困难,你能帮帮他吗?指针实现冒泡排序函数,函数名统一用voidbubbleSort(......