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

leetcode刷题日记——接雨水

[ 题目描述 ]:
在这里插入图片描述
[ 思路 ]:

  • 题目要求求凹进去的部分能接多少雨水,即有多少个格子
  • 可以从第一个高度快出发去寻找下一个高于或者等于他的格子,然后计算其中的差值
    • 有高于或等于他的格子,计算他俩中间能装的雨水
    • 当后续没有高于他的格子时,去寻找下一个有高度的格子
      • 如果相邻,则左边下标变为这个有高度格子的下标
      • 不相邻,求雨水数量
    • 找到的格子作为新的参照,然后再进行新一轮的遍历,直至全部找完
  • 突然想到如果没有高于他的格子,那是不是可以把他的高度削减一个,这样就不用判断下一个有高度的格子是否与他相邻
  • 运行如下
  • 时间复杂度为O(n*h),h为高度,如果最高的高度与次高度相差很大,那么时间会很大。但证明了其主体思路没有问题

在这里插入图片描述

int calculate(int *height,int left,int right){int sum=0;for(int i=left+1;i<right;i++){sum+=height[left]-height[i];}return sum;
}int trap(int* height, int heightSize) {int left=0,right=0,sum=0;while(right<heightSize){if(height[left]>height[right]){right++;}else{sum+=calculate(height,left,right);left=right;right++;}if(right==heightSize && left!=heightSize-1){height[left]--;right=left+1;}}return sum;
}
  • 最影响时间的就是指针回退,如果可以把指针回退删掉,那么时间复杂度就可以降到O(n)
  • 雨水的分布呈山字性,中间雨水的高度永远高于或等于两边的雨水
  • 雨水两边最低的墙决定了中间能存储多少雨水,那我们可以从两边向中间遍历,并记录两边的最大值,当遇见更大的值时进行更换,没遇见,则计算雨水
  • 运行如下:

在这里插入图片描述

int trap(int* height, int heightSize) {int left=0,right=heightSize-1,sum=0,left_max=height[0],right_max=height[heightSize-1];while(right!=left){if(left_max<=right_max){left++;if(height[left]>left_max){left_max=height[left];}else{sum+=left_max-height[left];}}else{right--;if(height[right]>right_max){right_max=height[right];}else{sum+=right_max-height[right];}}}return sum;
}
  • 时间复杂度O(n),空间复杂度O(1)

[ 官方题解 ]:

  • 一、动态规划,先记录每个柱子两边最高的柱子,然后从其中选择较低的柱子与其自身高度比较,较低柱子减去其自身高度就是存储的雨水量
int trap(int* height, int heightSize) {int n = heightSize;if (n == 0) {return 0;}int leftMax[n];memset(leftMax, 0, sizeof(leftMax));leftMax[0] = height[0];for (int i = 1; i < n; ++i) {leftMax[i] = fmax(leftMax[i - 1], height[i]);}int rightMax[n];memset(rightMax, 0, sizeof(rightMax));rightMax[n - 1] = height[n - 1];for (int i = n - 2; i >= 0; --i) {rightMax[i] = fmax(rightMax[i + 1], height[i]);}int ans = 0;for (int i = 0; i < n; ++i) {ans += fmin(leftMax[i], rightMax[i]) - height[i];}return ans;
}
  • 二、单调栈,使用单调递减栈维护柱子的索引,确保栈中柱子高度从栈底到栈顶单调递减。
    • 遇到更高的柱子时出栈,计算形成的“凹槽”能存多少水,计算公式为:存水量=(右边界索引−左边界索引−1)×(min(左边界高度,右边界高度)−当前柱子高度)
    • 不断重复直到遍历完整个数组,最终累加所有可能的存水量。
int trap(int* height, int heightSize) {int n = heightSize;if (n == 0) {return 0;}int ans = 0;int stk[n], top = 0;for (int i = 0; i < n; ++i) {while (top && height[i] > height[stk[top - 1]]) {int stk_top = stk[--top];if (!top) {break;}int left = stk[top - 1];int currWidth = i - left - 1;int currHeight = fmin(height[left], height[i]) - height[stk_top];ans += currWidth * currHeight;}stk[top++] = i;}return ans;
}
  • 三、双指针,思路及代码如上

相关文章:

leetcode刷题日记——接雨水

[ 题目描述 ]&#xff1a; [ 思路 ]&#xff1a; 题目要求求凹进去的部分能接多少雨水&#xff0c;即有多少个格子可以从第一个高度快出发去寻找下一个高于或者等于他的格子&#xff0c;然后计算其中的差值 有高于或等于他的格子&#xff0c;计算他俩中间能装的雨水当后续没有…...

阿里巴巴暑期实习Java面经,灵犀互娱一面

哈希表熟悉吗&#xff0c;可以如何实现&#xff1f; 开散列版本什么时候需要扩容 高并发服务器内的主从reactor模型是如何实现的&#xff1f; 进程 线程 协程 的区别&#xff1f; 如何保证线程安全 &#xff1f; 了解读写锁吗&#xff1f; 单例模式有了解吗&#xff1f; 可以怎…...

AI知识补全(十四):零样本学习与少样本学习是什么?

名人说&#xff1a;一笑出门去&#xff0c;千里落花风。——辛弃疾《水调歌头我饮不须劝》 创作者&#xff1a;Code_流苏(CSDN)&#xff08;一个喜欢古诗词和编程的Coder&#x1f60a;&#xff09; 上一篇&#xff1a;AI知识补全&#xff08;十三&#xff09;&#xff1a;注意力…...

如何用Postman实现自动化测试?

&#x1f345; 点击文末小卡片&#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 这里简单演示在postman中怎样实现自动化测试&#xff08;不涉及到用户登录的token认证&#xff09; 导入测试用例文件&#xff0c;测试web接口 postman使用流程…...

LeetCode Hot100 刷题笔记(9)—— 二分查找、技巧

目录 前言 一、二分查找 1. 搜索插入位置 2. 搜索二维矩阵 3. 在排序数组中查找元素的第一个和最后一个位置 4. 搜索旋转排序数组 5. 寻找旋转排序数组中的最小值 6. 寻找两个正序数组的中位数 二、技巧 1. 只出现一次的数字 2. 多数元素 3. 颜色分类 4. 下一个排列 5. 寻找重复…...

Ubuntu 系统上完全卸载 Docker

以下是在 Ubuntu 系统上完全卸载 Docker 的分步指南 一.卸载验证 二.卸载步骤 1.停止 Docker 服务 sudo systemctl stop docker.socket sudo systemctl stop docker.service2.卸载 Docker 软件包 # 移除 Docker 核心组件 sudo apt-get purge -y \docker-ce \docker-ce-cli …...

1017 Queueing at Bank

1017 Queueing at Bank 分数 25 全屏浏览 切换布局 作者 CHEN, Yue 单位 浙江大学 Suppose a bank has K windows open for service. There is a yellow line in front of the windows which devides the waiting area into two parts. All the customers have to wait in li…...

二分答案 + P8800 [蓝桥杯 2022 国 B] 卡牌 - 题解

题解&#xff1a;卡牌问题 题目传送门&#xff1a;P8800 [蓝桥杯 2022 国 B] 卡牌 一、题目描述 小明有n种卡牌&#xff0c;每种卡牌有a_i张。他可以用m张空白牌制作任意卡牌&#xff0c;但第i种卡牌最多只能制作b_i张。问最多能凑出多少套"完整卡牌"&#xff08;…...

Python----计算机视觉处理(Opencv:道路检测之道路透视变换)

一、透视变换 对于道路检测来说&#xff0c;为了方便车辆进行行驶&#xff0c;道路上都有车道线&#xff0c;为了更加方便对道路线进行检测&#xff0c;首先我们要把到路线平视图转变为俯视图&#xff0c;以便后期处理更加方便&#xff0c;如下图所示&#xff0c;该为虚拟场景的…...

为什么 ThreadLocalMap 的 key 是弱引用 value是强引用

问题一&#xff1a;为什么 ThreadLocalMap 的 key 是弱引用&#xff1f; 【假设 Entry 的 key 是对 ThreadLocal 对象的强引用】&#xff1a;这个 Entry 又持有 ThreadLocal 对象和 value 对象的强引用。如果在其他地方都没有对这个 ThreadLocla 对象的引用了、然后在使用 Thr…...

AI 能解开内容的「不可能三角」吗?

3月21日&#xff0c;以“‘AI商业’进化论”为主题的行业峰会在中欧国际工商学院上海校区成功举行&#xff0c;并发布人工智能与商业创新白皮书。本次活动由中欧国际工商学院与特赞科技Tezign联合主办&#xff0c;中欧特赞人工智能与商业创新研究基金承办&#xff0c;中欧AI与营…...

计算机网络 OSI参考模型

目录 OSS七层 OSI通信过程1 OSI通信过程2 应用层 表示层 会话层 传输层 网络层 数据链路层 物理层 OSS七层 OSI通信过程1 OSI通信过程2 应用层 表示层 会话层 传输层 网络层 数据链路层 物理层...

探索新一代大模型代理(LLM agent)及其架构

在人工智能大模型(AI)的浪潮中&#xff0c;2023年我们见证了检索增强生成(Retrieval Augmented Generation, RAG)的兴起&#xff0c;而2024年则无疑成为了“代理”agent的元年。各大AI企业纷纷投身于聊天机器人代理的研发中&#xff0c;工具如MultiOn通过与外部网站的连接实现了…...

AI应用案例(1)——智能工牌和会话质检

今天开辟一个新的模块&#xff0c;自己平时也搜集一些典型的行业应用案例&#xff0c;不如就记录到C站&#xff0c;同时和大家也是个分享好了。 今天分享的企业和产品&#xff0c;是循环智能的智能工牌。 这个产品应用场景清晰&#xff0c;针对的行业痛点合理&#xff0c;解决…...

操作系统高频(五)linux命令

操作系统高频&#xff08;五&#xff09;linux命令 1.Linux中查看进程运行状态的指令、tar解压文件的参数。⭐⭐⭐ 在Linux中&#xff0c;可以使用以下指令查看进程的运行状态&#xff1a; top&#xff1a; 用于实时监视系统的进程活动和系统资源使用情况。在终端中运行top…...

HMTL+JS+CSS实现贪吃蛇游戏,包含有一般模式,困难模式,还有无敌模式

HMTLJSCSS实现贪吃蛇游戏&#xff0c;包含有一般模式&#xff0c;困难模式&#xff0c;还有无敌模式&#xff08;可以穿墙死不了&#xff0c;从左边进去可以从右边出来&#xff09;&#xff0c;显示当前分数和最高分&#xff0c;吃到的球颜色可以叠加到蛇身体上 为了适配手机端…...

内网渗透——红日靶场二

目录 一、前期准备 DC机配置 PC机配置 WEB机配置 将PC机和WEB机的IP地址进行更改 开启WEB服务 二、外网探测 1.使用nmap扫描 2.目录扫描 3.漏洞扫描 &#xff08;1&#xff09;CVE-2017-3506&#xff08;getshell失败&#xff09; &#xff08;2&#xff09;CVE-201…...

【Unity】处理文字显示不全的问题

1.选中字体文件&#xff0c;检查 MultiAtlasTeextures 是否勾选&#xff0c;未勾选的话&#xff0c;先勾选保存后查看是否显示正常 2.勾选后未正常显示&#xff0c;则在搜索框中输入未显示的文本&#xff0c;确认字体图集是否包含该文本&#xff0c;然后点击Update Atlas Textu…...

深入解析力扣39.组合总和:回溯算法的妙用

题目描述 给定一个无重复元素的数组 candidates 和一个目标值 target&#xff0c;找出 candidates 中所有可以使数字和为 target 的组合。数组中的数字可以被重复使用。 示例&#xff1a; 输入: candidates [2,3,6,7], target 7 输出: [[2,2,3],[7]]代码解析 class Solut…...

汽车诊断开发入门以及OBD检测

一、OBD 概述 定义&#xff1a;OBD 即 On - Board Diagnostics&#xff0c;车载自动诊断系统。它能实时监测车辆各项系统和部件状态&#xff0c;以此帮助诊断故障并预警。设计初衷与发展&#xff1a;最初设计目的是控制汽车尾气排放&#xff0c;确保符合环境标准。随着技术进步…...

Android 中集成 Google 应用内评分

添加依赖 在项目的 build.gradle 文件中添加以下依赖&#xff1a; dependencies {// Java 依赖implementation com.google.android.play:review:2.0.1// Kotlin 依赖implementation com.google.android.play:review-ktx:2.0.1 }创建 ReviewManager 使用 ReviewManagerFactor…...

Ingredient-oriented Multi-Degradation Learning for Image Restoration论文阅读

摘要&#xff1a;重点在于关联多个任务本质的联系。 不同恢复任务的关联性很重要。 揭示退化现象的内在机理联系很有意义。 多合一的方法能在单一模型中处理多种退化问题&#xff0c;可扩展性较差。 成分导向范式挖掘不同图像退化现象背后的物理规律或特征模式。 成分导向退化重…...

避坑,c#开发人员学习开发app时.NET MAUI和Vue3 选择

经过一段时间学习vue3后才发现作为一个C#背景的开发人员从开发效率、调试便捷性、部署便利性考虑,Visual Studio + .NET MAUI 是更合适的选择,尤其是在跨平台原生应用开发场景中。以下是详细对比分析: 一、开发体验 1. 语言与生态适配 .NET MAUI:基于C#和.NET生态,与你现有…...

java项目挂机自动重启操作指南

前段时间有个伙伴问我&#xff0c;java项目挂机怎么自动重启。。。。。。今天就写一个 .sh脚本来实现应用挂机的自动重启功能 #!/bin/bash # 查询mita的进程个数 countps -ef | grep mita.jar | grep -v "grep" | wc -l # echo $count nowtimedate "%Y-%m-%d %H…...

Vue el-table-column内el-tooltip识别换行符 \n

结构&#xff1a; <el-table-column prop"callSummary" width"300" label"摘要"><template slot-scope"scope"><el-tooltip class"item" effect"dark" placement"top"><div v-ht…...

【C++指南】一文总结C++二叉搜索树

&#x1f31f; 各位看官好&#xff0c;我是egoist2023&#xff01; &#x1f30d; 种一棵树最好是十年前&#xff0c;其次是现在&#xff01; &#x1f680; 今天来学习C二叉搜索树的实现。 &#x1f44d; 如果觉得这篇文章有帮助&#xff0c;欢迎您一键三连&#xff0c;分享给…...

【报告】内镜视频图像分析Foundation Model

来源&#xff1a;医疗基础模型 仅供个人学习&#xff0c;侵权请联系我删除...

使用HTML5和CSS3实现炫酷的3D立方体动画

使用HTML5和CSS3实现炫酷的3D立方体动画 项目介绍 本文将详细介绍如何使用HTML5和CSS3技术实现一个交互式3D立方体动画。这个项目不仅展示了现代Web前端技术的强大功能&#xff0c;还能帮助读者深入理解CSS3的3D变换和动画特性。 技术栈 HTML5CSS3 (transform-style, persp…...

【春招笔试】2025.03.29-美团研发岗

📌 点击直达笔试专栏 👉《大厂笔试突围》 题目一:班级值班安排优化 1️⃣:计算员工值班时间总和 2️⃣:直接比较 n*k 与总和的大小关系 难度:简单 这道题目的核心在于数学模型的简化。通过分析平均分配的本质,我们发现只需直接比较员工数量与时间上限的乘积(n*k)和总…...

MySQL数据库和表的操作之SQL语句

&#x1f3af; 本文专栏&#xff1a;MySQL深入浅出 &#x1f680; 作者主页&#xff1a;小度爱学习 MySQL数据库和表的操作 关系型数据库&#xff0c;都是遵循SQL语法进行数据查询和管理的。 SQL语句 什么是sql SQL&#xff1a;结构化查询语言(Structured Query Language)&…...