力扣上的经典问题:接雨水

力扣上的经典问题:接雨水

在众多的编程题库中,力扣(LeetCode)是一个非常受欢迎的平台,拥有大量的算法和数据结构练习题。其中,接雨水(Trapping Rain Water)问题因其巧妙的思路和广泛的应用场景,成为了经典的面试题之一。在这篇博客中,我将介绍这个问题的背景,解决思路,并给出用C语言实现的解决方案。

问题描述

接雨水问题的描述如下:

给定一个表示高度的数组,数组中的每个元素表示一个柱子的高度,柱子之间的宽度为1。求出这个柱子图形在下雨之后能够接多少雨水。

举例来说,给定高度数组:

height = [0,1,0,2,1,0,1,3,2,1,2,1]

该数组表示的图形如下图所示:

          ##   ###   ##  ###############

通过图形可以看出,能够接住的雨水总量为6。

解题思路

解决这个问题的方法有很多种,常见的有以下几种:

  1. 暴力法:对于每一个柱子,分别计算其左右两边的最大高度,然后取其最小值减去柱子自身的高度,累加所有柱子能够接住的水量。
  2. 动态编程:预先计算每一个柱子的左边最高高度和右边最高高度,然后同样计算水量。
  3. 双指针法:使用双指针从两端向中间遍历,计算能够接住的水量。

下面我们主要介绍双指针法,这种方法时间复杂度为O(n),空间复杂度为O(1),比较高效。

C语言代码实现

#include <stdio.h>int trap(int* height, int heightSize) {if (heightSize == 0) return 0;int left = 0, right = heightSize - 1;int left_max = 0, right_max = 0;int water = 0;while (left < right) {if (height[left] < height[right]) {if (height[left] >= left_max) {left_max = height[left];} else {water += left_max - height[left];}left++;} else {if (height[right] >= right_max) {right_max = height[right];} else {water += right_max - height[right];}right--;}}return water;
}int main() {int height[] = {0, 1, 0, 2, 1, 0, 1, 3, 2, 1, 2, 1};int size = sizeof(height) / sizeof(height[0]);int result = trap(height, size);printf("The amount of trapped rain water is: %d\n", result);return 0;
}

代码解析

  1. 初始化变量

    • leftright 分别指向数组的两端。
    • left_maxright_max 分别记录左右两边的最大高度。
    • water 用于累加接住的雨水总量。
  2. 双指针遍历

    • 当左指针指向的高度小于右指针指向的高度时,处理左指针指向的柱子:
      • 如果当前高度大于或等于 left_max,更新 left_max
      • 否则,将 left_max 减去当前高度,得到当前柱子能接住的雨水量,累加到 water
    • 当右指针指向的高度小于等于左指针指向的高度时,处理右指针指向的柱子:
      • 如果当前高度大于或等于 right_max,更新 right_max
      • 否则,将 right_max 减去当前高度,得到当前柱子能接住的雨水量,累加到 water
  3. 输出结果:最终 water 中累加的值即为总共能接住的雨水量。

总结

接雨水问题是一个经典的动态规划问题,通过不同的方法可以优化时间和空间复杂度。双指针法因其较低的时间复杂度和空间复杂度,成为了面试中常见的解法之一。希望这篇博客能够帮助大家更好地理解接雨水问题,并掌握其解决思路和方法。


希望这篇博客对你有帮助!如果你有任何问题或需要进一步的解释,请随时告诉我。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/28663.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

数据通信与网络(二)

计算机网络的性能指标 包括速率、带宽、吞吐量、时延、时延带宽积和利用率。 还有一些非性能指标&#xff1a;如费用、质量、标准化、可靠性、可扩展性、可升级性和可维性。 一、速率 指计算机网络中的主机在信道上单位时间内传送数据量&#xff0c;又称数据率(data rate)或…

Python 学习 第二册 第14章 网络编程

----用教授的方式学习 目录 14.1 几个网络模块 14.1.1 模块 socket 14.1.2 模块 urllib 和 urllib2 14.1.3 其他模块 14.2 SocketServer 及相关的类 14.3.1 使用 SocketServer 实现分叉和线程化 14.3.2 使用 select 和 poll 实现异步 I/O 14.4 Twisted 14.4.1 下载…

聊聊jetcache的CacheManager

序 本文主要研究一下jetcache的CacheManager CacheManager jetcache-core/src/main/java/com/alicp/jetcache/CacheManager.java public interface CacheManager {<K, V> Cache<K, V> getCache(String area, String cacheName);void putCache(String area, Str…

架构扩展性

应用扩展性 X轴横向克隆 X轴横向克隆是指将应用部署在多个节点上&#xff0c;以实现负载均衡和高可用性。对于无状态应用&#xff0c;可以通过多节点克隆复制来实现横向扩展。而对于有状态应用&#xff0c;需要处理状态剥离&#xff0c;例如Session的处理。 具体来说&#x…

每日AI资讯-20240616

1. AI漫画角色一致性大突破 由中山大学和联想团队联合提出AutoStudio&#xff0c;它是一个无需训练的多智能体协同框架。AutoStudio采用基于大语言模型的三个智能体来处理交互&#xff0c;并使用基于扩散模型的Drawer生成高质量图像。实验中&#xff0c;AutoStudio无论是在定量…

java 将获取json中的值

在Java中&#xff0c;可以使用FastJson库来获取JSON中的value值。下面是一个简单的示例代码&#xff1a; import com.alibaba.fastjson.JSONObject;public class JsonExample {public static void main(String[] args) {// JSON字符串String jsonString "{\"key1\&…

腾讯地图避坑-获取地图点击点的经纬度

map.on(click,(evt)>{console.log("evt",evt)let lat evt.latLng.getLat();//lat 获取let lng evt.latLng.getLng();//lng 获取console.log("evt.latLng-有效方式",evt.latLng)console.log("evt[latlng]-无效方式",evt[latlng])})

PiDiNet推理手顺

GitHub链接 https://github.com/hellozhuo/pidinet 运行环境 Pyhton 3.8 filelock3.14.0 fsspec2024.5.0 imageio2.34.1 intel-openmp2021.4.0 Jinja23.1.4 lazy_loader0.4 MarkupSafe2.1.5 mkl2021.4.0 mpmath1.3.0 networkx3.1 numpy1.24.4 open…

小程序外卖开发中的关键技术与实现方法

小程序外卖服务凭借其便捷性和灵活性&#xff0c;正成为现代餐饮行业的重要组成部分。开发一个功能完善的小程序外卖系统&#xff0c;需要掌握一系列关键技术和实现方法。本文将介绍小程序外卖开发中的核心技术&#xff0c;并提供具体的代码示例&#xff0c;帮助开发者理解和实…

Verilog-学习verilog中遇到的问题总结

#学习记录# 目录 1 verilog中~和&#xff01;的区别 1 verilog中~和&#xff01;的区别 &#xff01;表示逻辑取反&#xff0c;~表示按位取反。当面对位宽为1时&#xff0c;两个操作符的作用相同。当位宽不为1时&#xff1a; ~会将变量的各个位依次取反&#xff1a;a[2:0]{…

认识异常

一、异常的概念和体系结构 1、异常的概念 在Java中&#xff0c;将程序执行过程中发生的不正常行为称为异常&#xff0c;常见的有算术异常&#xff0c;数组越界异常&#xff0c;空指针异常 2、异常的体系结构 从上图中可以看到&#xff1a; 1.Throwable&#xff1a;是异常体系…

Euro Efficiency(POJ, Open judge)

题目链接: 1252 -- Euro Efficiency 题目描述: 思路: 题面的大概意思就是给你一组基本面值的钱币&#xff0c;问你要凑出指定的面值最少需要多少个钱币的参与&#xff0c;钱币的参与可以是加法也可以是减法。 分析一下&#xff0c;由于答案与钱币参与的顺序无关&#xff0c;…

机器学习-课程整理及初步介绍

简介: 机器学习是人工智能的一个分支&#xff0c;它使计算机系统能够从经验中学习并改进其在特定任务上的表现&#xff0c;而无需进行明确的编程。机器学习涉及多种算法和统计模型&#xff0c;它们可以从数据中学习规律&#xff0c;并做出预测或决策。机器学习的应用非常广泛&…

LabVIEW的热门应用

LabVIEW是一种图形化编程语言&#xff0c;因其易用性和强大的功能&#xff0c;在多个行业和领域中广泛应用。介绍LabVIEW在以下五个热门应用领域中的使用情况&#xff0c;&#xff1a;工业自动化、医疗设备与生物医学工程、科学研究与实验室自动化、能源管理与智能电网、航空航…

[Shell编程学习路线]——if条件语句(单,双,多分支结构)详细语法介绍

&#x1f3e1;作者主页&#xff1a;点击&#xff01; &#x1f6e0;️Shell编程专栏&#xff1a;点击&#xff01; ⏰️创作时间&#xff1a;2024年6月17日7点50分 &#x1f004;️文章质量&#xff1a;95分 文章目录 ————前言———— &#x1f4af;趣站&#x1f4af…

C语言王国——深入自定义类型(结构体)

目录 一、引言 二、结构体 1. 结构体类型的声明 2. 结构体变量的创建和初始化 2.1 创建 2.2 初始化 2.3 typedef 2.4 特殊声明 2.5 自引用 3. 结构成员访问操作符 4. 结构体内存对齐 4.1 对齐规则 4.2 offsetof 4.3 为什么存在内存对齐 5. 结构体传参 6. 结构体实现…

RTOS实时操作系统

常见的RTOS有&#xff1a; VxWorks&#xff1a;广泛应用于工业、医疗、通信和航空航天领域。FreeRTOS&#xff1a;一个开源的RTOS&#xff0c;广泛用于嵌入式设备。uc/OS&#xff1a;一个适用于教育和小型商业项目的RTOS。QNX&#xff1a;主要应用于汽车和工业自动化领域。Win…

探索C嘎嘎的奇妙世界:第三关---缺省参数与函数重载

在c语言中,我们常常在对有参函数进行传参,这样的繁琐过程,C祖师爷对此进行了相关改进,多说无益,上干货: 1 缺省参数: 缺省参数是指在声明或定义函数时为函数的形参指定一个默认值&#xff08;默认参数&#xff09;。在调用该函数时&#xff0c;如果没有指定实参&#xff0c;则…

Linux常⽤服务器构建-ssh和scp

目录 1.ssh <1>ssh介绍 <2>安装ssh A.安装ssh服务器 B.远程登陆 <3>使⽤ssh连接服务器 2.scp 本地⽂件复制到远程&#xff1a; 本地⽬录复制到远程&#xff1a; 远程⽂件复制到本地&#xff1a; 远程⽬录复制到本地&#xff1a; 1.ssh <1>…

SQLite检索查询结果函数

代码 database.h #include <sqlite3.h> // &#xfffd;&#xfffd;&#xfffd;&#xfffd;SQLite&#xfffd;ӿں&#xfffd;&#xfffd;&#xfffd;#include<stdio.h>// &#xfffd;&#xfffd;&#xfffd;&#xfffd;һ&#xfffd;&#…