接雨水
大苹果

接雨水

给定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.length1<=n<=2*1040<=height[i]<=105解法一:/***@param{number[]}height*@return{number}*/vartrap=function(height){letleft=0;letright=height.length-1;letsum=0;letleftMax=0;letrightMax=0;while(left<right){if(height[left]<=height[right]){if(height[left]>=leftMax){leftMax=height[left];}else{sum+=leftMax-height[left];}left++;}else{if(height[right]>=rightMax){rightMax=height[right];}else{sum+=rightMax-height[right];}right--;}}returnsum;};说明:要计算给定柱子高度图中的接雨水量,我们可以使用双指针的方法进行计算。这个问题通常被称为“接雨水问题”(TrappingRainWaterProblem)。方法:双指针算法步骤初始化指针和变量:左指针left指向数组的开始位置(索引0)。右指针right指向数组的结束位置(索引n-1)。初始化left_max和right_max分别为柱子高度的初始左端和右端。初始化water_trapped变量为0,用于存储总的接雨水量。遍历柱子高度数组:如果height[left]小于等于height[right]:否则:如果height[left]大于等于left_max,则更新left_max。否则,计算当前位置能接的水量为left_max-height[left],并将该水量累加到water_trapped。移动左指针,即left增加1。如果height[right]大于等于right_max,则更新right_max。否则,计算当前位置能接的水量为right_max-height[right],并将该水量累加到water_trapped。移动右指针,即right减少1。当left小于right时,进行以下操作:返回结果:当循环结束时,water_trapped即为接雨水的总量。算法实现下面是用Python实现的代码:deftrap(height):ifnotheight:return0left,right=0,len(height)-1left_max,right_max=height[left],height[right]water_trapped=0whileleft<right:ifheight[left]<=height[right]:ifheight[left]>=left_max:left_max=height[left]else:water_trapped+=left_max-height[left]left+=1else:ifheight[right]>=right_max:right_max=height[right]else:water_trapped+=right_max-height[right]right-=1returnwater_trapped#示例height=[0,1,0,2,1,0,1,3,2,1,2,1]result=trap(height)print("能接的雨水总量:",result)示例输入:height=[0,1,0,2,1,0,1,3,2,1,2,1]输出:6解释在这个例子中,按照这种高度排列的柱子,经过雨水积累后,能够接住的雨水总量为6。复杂度分析时间复杂度:O(n),其中n是柱子高度数组的长度。我们只需遍历一次数组。空间复杂度:O(1),除了存储变量外,不需要额外的空间。这种方法有效地利用了双指针技巧,通过一次遍历即可完成对接雨水量的计算,是解决该问题的常用方法之一。

栈,数组,双指针,动态规划,单调栈 739 2月前
c语言学习计划
大苹果

c语言学习计划

学习C语言是一项值得投入时间和精力的任务,因为它是一种强大而灵活的编程语言,广泛用于系统编程、嵌入式系统、游戏开发等领域。以下是一个从零开始的学习路径和计划,帮助你循序渐进地掌握C语言。学习计划概述阶段1:基础入门目标:理解C语言的基本语法和结构。时间:1-2周学习内容C语言简介C语言的历史和应用C语言的编译和执行过程基本语法数据类型(int,float,char等)变量和常量运算符(算术、关系、逻辑、赋值等)控制结构条件语句(if,elseif,else)循环语句(for,while,do-while)输入输出printf和scanf函数文件输入输出的基本操作阶段2:进阶主题目标:掌握更复杂的数据结构和编程技术。时间:2-4周学习内容数组和字符串一维数组和多维数组字符串处理(<string.h>库函数)函数函数的定义与调用递归函数作用域与生命周期指针指针的基本概念指针与数组指针与字符串指针的高级用法(指针函数,函数指针)结构体和联合体结构体定义与使用嵌套结构体联合体的使用阶段3:高级主题目标:熟悉C语言高级特性和内存管理。时间:3-5周学习内容动态内存分配malloc,calloc,realloc,free动态数组和链表的实现文件操作文件的打开和关闭文件读写操作(文本文件和二进制文件)预处理器指令宏定义和条件编译文件包含(#include)C标准库常用库函数(<math.h>,<stdlib.h>,<time.h>等)阶段4:项目实践目标:通过项目实践巩固所学知识。时间:2-3周项目示例简单的计算器支持基本的算术运算错误处理和输入验证学生管理系统使用结构体存储学生信息提供增删改查功能文本文件的统计分析统计文件中的字符、单词、行数实现简单的数据分析功能小游戏开发一个简单的猜数字游戏或井字棋游戏阶段5:拓展学习目标:探索C语言的更高级应用和其他编程语言的关联。时间:根据个人兴趣持续学习学习内容数据结构与算法链表、栈、队列、树、图等数据结构常见算法(排序、查找、动态规划等)系统编程进程管理与线程网络编程基础(套接字编程)嵌入式系统嵌入式编程基础硬件与软件的交互与其他语言的比较学习C++,理解面向对象编程探索与C语言相关的现代编程语言(如Rust)学习资源在线教程CProgrammingLanguage-GeeksforGeeksLearn-C.org-InteractiveCTutorial书籍《C程序设计语言》(TheCProgrammingLanguage)-作者:BrianW.Kernighan,DennisM.Ritchie经典的C语言入门书籍,详细介绍了C语言的基础和高级概念。《CPrimerPlus》-作者:StephenPrata一本全面的C语言教程,适合初学者和进阶学习者。视频课程CProgrammingforBeginners-UdemyCProgrammingTutorial-freeCodeCamp.orgYouTube学习建议每天学习​:每天至少花1-2小时学习和练习,以保持连续性。动手实践:编写代码是掌握编程的关键。通过编写小项目和解决编程问题来应用所学知识。多做练习​:练习C语言中的常见问题,使用在线编程平台如LeetCode和CodeChef。参与社区:加入C语言的学习社区和论坛,参与讨论和解决问题。通过坚持这个学习计划并利用丰富的学习资源,你可以在数月内掌握C语言的基础和高级概念。希望这个计划对你有所帮助!如果你有任何问题或需要更多建议,请随时告诉我。

c,C语言 204 2月前
共 1 页