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

稀碎从零算法笔记Day31-LeetCode:接雨水

半月一去,望舒一轮,明天开始攻坚哈德题了

前言:非常经典的一道笔试题,看了保证血赚(今天银泰星笔试第四题就是这个)

题型:dp、模拟、双指针……

链接:42. 接雨水 - 力扣(LeetCode)

来源:LeetCode

方法好多,这里用的“F大佬”的双指针思路

题目描述

本题为Hard题,建议配合样例&题解食用

给定 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

题目思路

初见这道题是银泰星的笔试第四道,道理明白,但是不知道怎么实现

这时候一股神秘的“东方力量”:dp,dp呀~

OK,那笔者就写一下自己用DP的做法(二周目,一周目是BE//(ㄒoㄒ)/~~)

能接到雨水,归根到底是保证两边的柱子高,中间柱子矮,那就可以存水。

这边可以把这种结构想象成【木桶】——那么影响木桶盛水的因素就是木桶的短板。虽然很抽象,但可以把相邻柱子的边看作是【木桶的板】,那么这个【木桶】能盛水的量,就是min(左板,右板)- height[i] 。

一个木桶是这样的,如果不断地扩大木桶的个数,那就相当于DP中的 将子问题放大了。

                ​​​​​​​        ​​​​​​​        ​​​​​​​        

当然断不可【无脑放大】——即只看相邻的柱子的高度。这部分,要想求得水的高度,说明【相邻最大的边】这个条件是不行的。这时候不难发现,应该是【右/左边最大的边】。这时候带入样例就合理多了。

那么获得【右/左边最长的边】,即获得两个方向最高柱子的高度,就是本题DP的破局点。
以求【往左走,经历过最高的柱子高度】为例,dpL[i] 表示 i 这个索引左边中,最高的柱子的高度。
可以dpL[i]会经历两个状态:①如果dpL[i-1] 比height[i]大,那k继续往左走,因为他之前的柱子中就有比height[k]高的 ② 如果dpL[k-1]要小的话,那就乖乖把dpL[i] 更新为height[i] 。

那么递归式就是: dp[i] = max(dp[i-1] , height[i])

因为木桶有两边的缘故,自然要求相反走向的【最高的柱子高度】

C++代码

dp,用了两个数组

class Solution {
public://银泰星笔试int trap(vector<int>& height) {int len = height.size();if(len <3)return 0;// 要确定动态申请数组的元素的个数,要不会野指针vector<int> dp_left(len);//从左边开始走vector<int> dp_right(len);//从右边开始走dp_left[0] = height[0];dp_right[len-1] = height[len-1];for(int i=1;i<len;i++){dp_left[i] = max(dp_left[i-1],height[i]);}for(int i=len-2;i>=0;i--){dp_right[i] = max(dp_right[i+1],height[i]);}int ans = 0;for(int i=0;i<len;i++){int temp = min(dp_left[i],dp_right[i]) - height[i];if(temp > 0)ans += temp;}return ans;}
};

结算页面 

dp

http://www.lryc.cn/news/329083.html

相关文章:

  • 微前端的使用和注意事项 - qiankun
  • uniapp微信小程序消息订阅详解
  • git 查看文件夹结构树
  • 设计模式一详解
  • python 进程、线程、协程基本使用
  • SQLite3进行数据库各项常用操作
  • Debian GNU/Linux 安装docker与docker compose
  • 图片标注编辑平台搭建系列教程(2)——fabric.js简介
  • Debian linux版本下运行的openmediavault网盘 千兆网卡升级万兆
  • 前端 CSS 经典:grid 栅格布局
  • 多输入多输出通道
  • http响应练习—在服务器端渲染html(SSR)
  • C++(8): std::deque的使用
  • openwrt开发包含路由器基本功能的web问题记录
  • HarmonyOS ArkTS 骨架屏加载显示(二十五)
  • Ruoyi-Cloud-Plus_使用Docker部署分布式微服务系统_环境准备_001---SpringCloud工作笔记200
  • RN封装的底部向上弹出的弹出层组件
  • 基于深度学习YOLOv8+PyQt5的水底海底垃圾生物探测器检测识别系统(源码+数据集+配置说明)
  • SpringBoot集成WebSocket实现简单的多人聊天室
  • 如何使用固定公网地址远程访问内网Axure RP生成的网站原型web页面
  • 蓝桥杯习题
  • AMS概念以及面试相关整理
  • Vmware下减小Ubuntu系统占用系统盘大小
  • 面试题-Elasticsearch集群架构和调优手段(超全面)
  • python基础练习题6
  • Chrome 插件各模块使用 Fetch 进行接口请求
  • 内存可见性
  • Android room 在dao中不能使用挂起suspend 否则会报错
  • 【stable diffusion扩散模型】一篇文章讲透
  • 数据链路层之信道:数字通信的桥梁与守护者