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

力扣每日一题——接雨水

题目描述

给定 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 个单位的雨水(蓝色部分表示雨水)。

解法一——动态规划

在给出的数组中,为了求可以接到雨水的量,我们可以遍历数组,找到下标i处左右两侧的最高值之差,将每个点处的雨水量想加,即为所求值,所以我们可以利用两个数组来分别存放下标i处的左右最高值

代码如下

int min(int a,int b)
{if(a>=b){return b;}else{return a;}
}
int trap(int* height, int heightSize) {int l=heightSize;printf("%d",l);int left_data[l];int right_data[l];for(int i=0;i<l;i++){left_data[i]=0;right_data[i]=0;}int temp=height[0];for(int i=0;i<l;i++){if(temp<height[i]){temp=height[i];}    left_data[i]=temp;    }temp=height[l-1];for(int i=l-1;i>=0;i--){if(temp<height[i]){temp=height[i];}right_data[i]=temp;}int sum=0;for(int i=0;i<l;i++){int a=min(left_data[i],right_data[i]);if(a>height[i]){sum+=a-height[i];}}return sum;
}

解法二——栈

在题中,只有在低洼处才会聚集雨水,所以我们可以利用单调栈来解决这个问题,在栈中存入下标值,便于查找

遍历数组,将数据下标按照值单调递减的逻辑进行入栈,当当前下标的数据值大于栈顶元素的数据值,进行一系列操作,当一次遍历结束后,sum值即为所求

操作:

1.先将栈顶元素出栈并存储,新的栈顶元素便是低洼处的左边的下标值,遍历的下标值i是低洼处的右边的下标值,所以低洼处的高度为二者想减再减一,高度为二者的数据值的最小值再减去低洼处自身的高度值

2.一直持续上述操作,直到栈为空或栈中元素满足单调递减的逻辑,将雨水值依次相加

代码如下

int min(int a,int b)
{if(a<=b)return a;elsereturn b;
}
int trap(int* height, int heightSize) {int l=heightSize;int stack[l];int top=-1;int sum=0;for(int i=0;i<l;i++){while(top!=-1&&height[stack[top]]<height[i]){int temp=stack[top];top--;if(top==-1){break;}int le=stack[top];sum+=(i-le-1)*(min(height[i],height[le])-height[temp]);}top++;stack[top]=i;}return sum;
}

解法三——双指针

这个解法的关键就是首先要确立一个较高的值来作为左边界或右边界,当已经确立了一个边界时,无论是向右遍历还是向左遍历,都只需要判断当前下标的高度值是否小于上一个遍历下标的高度值即可,其实这里的指针并非是真正的指针,只是两个用来做判断的标志

代码如下

int trap(int* height, int heightSize) {int sum=0;int left=0;int right=heightSize-1;int max_l=0;int max_r=0;while(left<right){if(height[left]<height[right]){if(height[left]>max_l){max_l=height[left];}else{sum+=max_l-height[left];}left++;}   else{if(height[right]>max_r){max_r=height[right];}else{sum+=max_r-height[right];}right--;}     }return sum;
}

http://www.dtcms.com/a/556913.html

相关文章:

  • 基于AWS Lambda事件驱动架构与S3智能生命周期管理的制造数据自动化处理方案
  • 营商环境建设网站建设公司网站的必要性
  • 小网站广告投放网站做支付需要准备什么东西吗
  • 第六届“大湾区杯”粤港澳金融数学建模竞赛赛题浅析-助攻快速选题
  • 【车载Android】使用自定义插件实现多语言自动化适配
  • 学习网站建设要什么学历网站颜色表
  • C++ 分治 归并排序解决问题 力扣 315. 计算右侧小于当前元素的个数 题解 每日一题
  • Linux UdpSocket的应用
  • docker compose 创建MySQL8后在容器里备份数据到宿主机(.sql文件)的方式
  • 南昌网站外包几何图形生成网站
  • 《算法通关指南:数据结构和算法篇 --- 顺序表相关算法题》--- 询问学号,寄包柜,合并两个有序数组
  • OS_3 Memory、4 File、5 IO
  • Jenkins vs Tekton vs Arbess,CI/CD工具一文纵评
  • 如何挑选中药饮片供应商才能确保产品质量与安全?
  • 自己制作的网站如何发布素材网站都有哪些
  • 双非大学生自学鸿蒙5.0零基础入门到项目实战 -《基础篇》
  • webrtc代码走读(十四)-QOS-Jitter
  • 计算机网络经典问题透视:当路由器需要同时连接以太网和ATM网络时,需要添加什么硬件?
  • IntelliJ IDEA从安装到使用:零基础完整指南
  • 怎么做局域网asp网站做网站1天转多钱
  • Oracle常用
  • [VT-Refine] Simulation | Fine-Tuning | docker/run.sh
  • 如何修改网站域名制作自己的网站需要什么材料
  • docker快速上手笔记
  • 生成私钥公钥
  • 免费自助建站自助建站平台推广一般收多少钱
  • 《玩转Docker》[应用篇13]:Docker安装部署Emby及使用技巧:家庭媒体服务器
  • switch case语句中return的用法及说明
  • Unity 错误UserSettings\Layouts\CurrentMaximizeLayout.dwlt
  • zsh: corrupt history file /home/tipriest/.zsh_history的解决办法