首页 > 其他分享 >力扣经典150题第十六题:接雨水

力扣经典150题第十六题:接雨水

时间:2024-04-11 13:29:37浏览次数:24  
标签:150 right 第十六 max 雨水 height 力扣 ans left

目录

力扣经典150题第十六题:接雨水

1. 题目描述

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

示例 1:

输入: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

提示:

n == height.length
1 <= n <= 2 * 104
0 <= height[i] <= 105

2. 问题分析

接雨水的问题可以使用双指针或者栈来解决。这里我们介绍使用双指针的解法。

3. 解题思路

  • 使用两个指针 leftright 分别从数组的两端向中间移动。
  • 定义变量 left_maxright_max 分别表示左侧和右侧的最大高度。
  • 使用变量 ans 来累计接到的雨水量。
  • 如果 height[left] < height[right],则更新 left 端,否则更新 right 端。
  • 每次移动指针时,更新对应一侧的最大高度,并根据当前柱子的高度和最大高度的关系计算接到的雨水量并累加到 ans 中。

4. 代码实现

class Solution {
    public int trap(int[] height) {
        int left = 0, right = height.length - 1;
        int left_max = 0, right_max = 0;
        int ans = 0;
        
        while (left < right) {
            if (height[left] < height[right]) {
                if (height[left] >= left_max) {
                    left_max = height[left];
                } else {
                    ans += left_max - height[left];
                }
                left++;
            } else {
                if (height[right] >= right_max) {
                    right_max = height[right];
                } else {
                    ans += right_max - height[right];
                }
                right--;
            }
        }
        
        return ans;
    }
}

5. 时间复杂度分析

  • 单次遍历数组,时间复杂度为 O(n)。

6. 应用和扩展

  • 该算法可以有效地解决接雨水的问题,通过双指针从两侧向中间移动,根据柱子高度的不同情况计算接到的雨水量。
  • 可以在实际中应用于计算积水等场景。

7. 总结

本文介绍了如何使用双指针来解决接雨水的问题,通过计算左右两侧的最大高度来确定柱子之间可以接到的雨水量。

8. 参考资料

标签:150,right,第十六,max,雨水,height,力扣,ans,left
From: https://blog.csdn.net/weixin_44976692/article/details/137616780

相关文章

  • 力扣经典150题第十五题:分发糖果
    目录力扣经典150题第十五题:分发糖果1.题目描述2.问题分析3.解题思路4.代码实现5.时间复杂度分析6.应用和扩展7.总结8.参考资料力扣经典150题第十五题:分发糖果1.题目描述n个孩子站成一排。给你一个整数数组ratings表示每个孩子的评分。你需要按照以下......
  • LeetCode 面试经典150题---005
    ####135.分发糖果n个孩子站成一排。给你一个整数数组ratings表示每个孩子的评分。你需要按照以下要求,给这些孩子分发糖果:每个孩子至少分配到1个糖果。相邻两个孩子评分更高的孩子会获得更多的糖果。请你给每个孩子分发糖果,计算并返回需要准备的最少糖果数目。n==rat......
  • 2024.4.11力扣每日一题——互质树
    2024.4.11题目来源我的题解方法一深度优先遍历+回溯+存储父节点方法二官方深度优先遍历题目来源力扣每日一题;题序:1766我的题解方法一深度优先遍历+回溯+存储父节点使用一个List存储深度优先遍历过程中的父节点,然后从List的右侧开始遍历,直到与当前节点互质......
  • 从理论到实践:01背包问题在分割等和子集中的应用(力扣416)
    文章目录题目题解一、思路二、解题方法三、Code总结在昨天的文章(传送门)中,我们从理论对01背包问题进行了基础详细的讲解,从二维数组到一维数组进行优化,今天我们用实际题目来运用一下01背包问题的动态规划,要使用01背包问题中的一维dp数组解题,如果对这个不清楚的话,可以......
  • LeetCode 面试经典150题---004
    ####274.H指数给你一个整数数组citations,其中citations[i]表示研究者的第i篇论文被引用的次数。计算并返回该研究者的h指数。根据维基百科上h指数的定义:h代表“高引用次数”,一名科研人员的h指数是指他(她)至少发表了h篇论文,并且至少有h篇论文被引用次数大......
  • GD32F470_GP2Y0A02YK0F 红外激光测距传感器 避障测距20-150cm模块移植
    2.4红外测距传感器GP2Y0A02YKOF是夏普的一款距离测量传感器模块。它由PSD(positionsensitivedetector)和IRED(infraredemittingdiode)以及信号处理电路三部分组成。由于采用了三角测量方法,被测物体的材质、环境温度以及测量时间都不会影响传感器的测量精度。传感器输......
  • 力扣78 子集 Java版本
    文章目录题目描述代码注意题目描述给你一个整数数组nums,数组中的元素互不相同。返回该数组所有可能的子集(幂集)。解集不能包含重复的子集。你可以按任意顺序返回解集。示例1:输入:nums=[1,2,3]输出:[[],[1],[2],[1,2],[3],[1,3],[2,3],[1,2,3]]示例2......
  • 力扣51 N皇后 Java版本
    文章目录题目描述代码题目描述按照国际象棋的规则,皇后可以攻击与之处在同一行或同一列或同一斜线上的棋子。n皇后问题研究的是如何将n个皇后放置在n×n的棋盘上,并且使皇后彼此之间不能相互攻击。给你一个整数n,返回所有不同的n皇后问题的解决方案。每......
  • 【leetcode面试经典150题】26.判断子序列(C++)
    【leetcode面试经典150题】专栏系列将为准备暑期实习生以及秋招的同学们提高在面试时的经典面试算法题的思路和想法。本专栏将以一题多解和精简算法思路为主,题解使用C++语言。(若有使用其他语言的同学也可了解题解思路,本质上语法内容一致)【题目描述】给定字符串 s 和 t ......
  • 力扣经典150题第十三题:除自身以外数组的乘积
    目录力扣经典150题第十三题:除自身以外数组的乘积1.简介2.问题分析3.解题思路方法一:左右乘积列表方法二:优化空间复杂度4.代码实现5.时间复杂度分析6.应用和扩展7.总结8.参考资料力扣经典150题第十三题:除自身以外数组的乘积1.简介本文介绍如何设计一个算......