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

leetcode42接雨水问题

接雨水

题目描述

 

题目分析 

核心思想:

 

代码 

java版本:

package com.pxx.leetcode.trapRainWaterDoublePoniter;

public class Solution1 {
    public int trap(int[] height) {
        if (height.length == 0) {
            return 0;
        }
        int n = height.length;
        int left = 0;
        int right = n - 1;

        int leftMax = height[0];
        int rightMax = height[n - 1];

        int ans = 0;//保留水通的总数的

        //边走边计算每一个位置
        while (left <= right) {
            leftMax = Math.max(leftMax, height[left]);
            rightMax = Math.max(rightMax, height[right]);

            //刚开始两个相等
            //我们的目的是找到一个最小值,然后减去当前的水通高度
            //数据分析:4 2 0 3 2 5
            //leftMax = height[0] = 4;
            //rightMax = height[5] = 5;
            //选择leftMax 因为它小,所以 ans = 4 - 4 = 0;//当前水通单位为0
            //既然leftMax被占据了之后,那么它就要++,因为这个桶的位置已经被计算完了left++
            //结束之后leftMax与rightMax已经别保留了下来,也就是leftMax = 4,rightMax = 5;
            //---------------------------进入循环(left(1) <= right(5))------------------------------------
            //判定左边最大值max(4(被上次保留的最大值),当前桶的高度=2)->leftmax = 4;
            //判定右边最大值max(5, 5)->rightMax = 5
            //这个时候是leftMax=4, 因为leftMax比较小,ans = 0(上面的水通单位,后面类推) + (4 - 2(当前水通高度) = 2)
            //上面就计算出当前水通能存储的水量是2 ans = 0+2;//目前占两个水通单位
            //保留最大值与最小值,杀入下一次循环里面,因为left又被占了,所以left又要++,right依旧保持不动
            //---------------------------进入循环(left(2) <= right(5))--------------------------------------
            //max(4, 0)->leftmax = 4
            //max(5, 5)->rightmax = 5
            //还是左边比较小,那么又杀入左边
            //ans = 2(上面的水桶数) + (4)(4-height[i(2)=0,4-0]) = 6;
            //--------------------------
            //改变情况简单分析
            //一旦左边leftMax > rightMax
            //就要从右边开始轮替占位了
            //核心思想:哪边小,哪边站位,哪边轮替
            if (leftMax < rightMax) {
                ans += leftMax - height[left];
                left++;
            } else {
                ans += rightMax - height[right];
                right--;
            }
        }
        return ans;
    }
}

 c语言版本:

#include <stdio.h>

int trap(int height[], int n) {
    if (n == 0) {
        return 0;
    }

    int left = 0;
    int right = n - 1;

    int leftMax = height[0];
    int rightMax = height[n - 1];

    int ans = 0;

    while (left <= right) {
        leftMax = leftMax > height[left] ? leftMax : height[left];
        rightMax = rightMax > height[right] ? rightMax : height[right];

        if (leftMax < rightMax) {
            ans += leftMax - height[left];
            left++;
        } else {
            ans += rightMax - height[right];
            right--;
        }
    }
    return ans;
}

int main() {
    // 示例用法
    int height[] = {4, 2, 0, 3, 2, 5};
    int n = sizeof(height) / sizeof(height[0]);

    int result = trap(height, n);

    printf("存储的水量是:%d\n", result);

    return 0;
}


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

相关文章:

  • 【MySQL】RedHat8安装mysql9.1
  • 如何轻松导出所有 WordPress URL 为纯文本格式
  • Vue模块化开发的理解
  • Oracle OCP认证考试考点详解082系列19
  • 【C++滑动窗口】1248. 统计「优美子数组」|1623
  • 详细分析ip addr show 查看网络配置的命令
  • Javascript每天一道算法题(十八)——矩阵置零-中等
  • 带你用uniapp从零开发一个仿小米商场_10. 首页开发
  • MATLAB算法实战应用案例精讲-【图像处理】图像增强
  • go 在使用Elasticsearch 聚合查询时 如何设置使用中国时区
  • C语言第三十五弹---打印九九乘法表
  • 【JMeter】不同场景下的接口请求
  • Sass基础知识详细讲解【附带表图】
  • ubuntu22.04 安装 jupyterlab
  • C#中警告IDE0290、IDE1006、IDE1100、IDE0251、IDE0300及处理
  • flutter 输入框组件 高度问题
  • 大语言模型:以Amazon Titan等大语言模型为例介绍
  • Vue简易的车牌输入键盘,可以根据需要修改
  • 如何搭建zerotier服务器组网实现内网穿透
  • AIGC技术的未来趋势:创新、智能化与社会影响
  • Java八股文面试全套真题【含答案】- Linux篇
  • 操作系统 选择题 期末试题 考研真题 + 参考答案
  • OpenGL 自学总结
  • 一次简单的 Http 请求异常处理 (请求的 url 太长, Nginx 直接返回 400, 导致请求服务异常)
  • FPGA模块——DA转换模块(AD9708类)
  • DIO算法