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

谷歌(Google)历年编程真题——接雨水

谷歌历年面试真题——数组和字符串系列真题练习。

接雨水

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

思路一:双指针

这个问题可以使用双指针的方法来解决。具体步骤如下:

  1. 初始化左右指针 leftright,分别指向数组的第一个和最后一个元素。
  2. 初始化两个变量 left_maxright_max,分别表示左侧柱子的最大高度和右侧柱子的最大高度,初始值都为0。
  3. 使用循环遍历数组,当 left 指针小于等于 right 指针时,执行以下步骤:
    • 如果 height[left] < height[right],表示左侧柱子较低,则计算当前位置的雨水量,并更新左侧最大高度 left_max
    • 否则,表示右侧柱子较低,则计算当前位置的雨水量,并更新右侧最大高度 right_max
    • 在计算雨水量时,当前位置能够接的雨水量等于当前最小高度(left_maxright_max中的较小值)与当前柱子高度之差。
  4. 返回计算得到的总雨水量。

下面是相应的Python代码实现:

def trap(height):if not height:return 0left, right = 0, len(height) - 1left_max, right_max = 0, 0ans = 0while left <= right:if height[left] < height[right]:if height[left] >= left_max:left_max = height[left]else:ans += left_max - height[left]left += 1else:if height[right] >= right_max:right_max = height[right]else:ans += right_max - height[right]right -= 1return ans# 示例 1
height1 = [0,1,0,2,1,0,1,3,2,1,2,1]
print(trap(height1))  # 输出:6# 示例 2
height2 = [4,2,0,3,2,5]
print(trap(height2))  # 输出:9

这个函数使用双指针的方法,通过一次遍历就可以计算出雨水的总量。

思路二:栈

除了双指针的方法外,还可以使用栈来解决这个问题。具体步骤如下:

  1. 初始化一个栈 stack 和一个变量 ansans 用于记录接到的雨水量,初始值为0。
  2. 遍历数组 height 中的每一个柱子,依次执行以下操作:
    • 如果栈为空,或当前柱子高度小于等于栈顶柱子高度,则将当前柱子下标入栈。
    • 否则,说明当前柱子可能会形成一个水池,将栈中元素逐个弹出,直到遇到柱子高度大于当前柱子高度的位置。每次弹出时,都计算当前柱子和栈顶柱子之间的距离,并根据距离和高度差计算雨水量,然后累加到 ans 中。
    • 最后将当前柱子下标入栈。
  3. 遍历完成后,返回 ans 即为最终的雨水量。

下面是相应的 Python 代码实现:

def trap(height):stack = []ans = 0for i in range(len(height)):while stack and height[i] > height[stack[-1]]:top = stack.pop()if not stack:breakdistance = i - stack[-1] - 1bounded_height = min(height[i], height[stack[-1]]) - height[top]ans += distance * bounded_heightstack.append(i)return ans# 示例 1
height1 = [0,1,0,2,1,0,1,3,2,1,2,1]
print(trap(height1))  # 输出:6# 示例 2
height2 = [4,2,0,3,2,5]
print(trap(height2))  # 输出:9

这个函数使用栈的方法,通过一次遍历就可以计算出雨水的总量。

思路三:动态规划

除了双指针和栈的方法外,还可以使用动态规划来解决这个问题。具体步骤如下:

  1. 初始化两个数组 left_maxright_max,分别用于存储每个柱子左侧和右侧的最大高度。
    • left_max[i] 表示第 i 个柱子左侧(包括自身)的最大高度。
    • right_max[i] 表示第 i 个柱子右侧(包括自身)的最大高度。
  2. 遍历数组 height,从左向右更新 left_max,从右向左更新 right_max
  3. 遍历数组 height,对于每个柱子,计算该位置上可以接到的雨水量,即 min(left_max[i], right_max[i]) - height[i]
  4. 累加所有位置上的雨水量,即为最终的雨水总量。

下面是相应的 Python 代码实现:

def trap(height):n = len(height)if n == 0:return 0left_max = [0] * nright_max = [0] * n# 初始化 left_maxleft_max[0] = height[0]for i in range(1, n):left_max[i] = max(left_max[i - 1], height[i])# 初始化 right_maxright_max[n - 1] = height[n - 1]for i in range(n - 2, -1, -1):right_max[i] = max(right_max[i + 1], height[i])# 计算雨水量ans = 0for i in range(n):ans += min(left_max[i], right_max[i]) - height[i]return ans# 示例 1
height1 = [0,1,0,2,1,0,1,3,2,1,2,1]
print(trap(height1))  # 输出:6# 示例 2
height2 = [4,2,0,3,2,5]
print(trap(height2))  # 输出:9

这个函数使用动态规划的方法,通过三次遍历就可以计算出雨水的总量。

相关文章:

谷歌(Google)历年编程真题——接雨水

谷歌历年面试真题——数组和字符串系列真题练习。 接雨水 给定 n 个非负整数表示每个宽度为 1 的柱子的高度图&#xff0c;计算按此排列的柱子&#xff0c;下雨之后能接多少雨水。 示例 1&#xff1a; 输入&#xff1a;height [0,1,0,2,1,0,1,3,2,1,2,1] 输出&#xff1a;…...

golang 归并回源策略

前言 下面是我根据业务需求画了一个架构图&#xff0c;没有特别之处&#xff0c;很普通&#xff0c;都是我们常见的中间件&#xff0c;都是一些幂等性GET 请求。有一个地方很有意思&#xff0c;从service 分别有10000 qps 请求到Redis&#xff0c;并且它们的key 是一样的。这样…...

【漏洞复现】可视化融合指挥调度平台 dispatch接口处存在任意文件上传漏洞

免责声明&#xff1a;文章来源互联网收集整理&#xff0c;请勿利用文章内的相关技术从事非法测试&#xff0c;由于传播、利用此文所提供的信息或者工具而造成的任何直接或者间接的后果及损失&#xff0c;均由使用者本人负责&#xff0c;所产生的一切不良后果与文章作者无关。该…...

最讨厌这种字符串问题了!!

题目&#xff1a;洛谷P1957口算练习题 题目大意描述&#xff1a; 第一行输入一个整数表示接下来要进行多少次运算&#xff0c;接下来每行输入一个字母c和两个数字x,y&#xff08;输入的字母为a/b/c,分别表示要进行&#xff0c;-&#xff0c;*运算&#xff09;或者就输入两个数…...

B-名牌赌王(本人遇到的题,做个笔记)

题解&#xff1a; #include <iostream> #include <queue> //需要用小根堆的优先队列 #include <unordered_map> //用无序映射 using namespace std; bool pai() {int n, m;cin >> n >> m; priority_queue<int, vector<int>, gr…...

博客评论回复03

接着之前写的&#xff0c;之前返回的数据集按道理来说渲染出来还是丑丑的&#xff0c;因此这次我看着抖音的评论样子&#xff0c;自己瞎写了一通&#xff0c;不过也算是模仿出来了虽然肯定没有抖音写的好。 类似与前面几章写的表结构 首先看看抖音评论区是怎么样的&#xff1f…...

【【萌新的学习之Numpy数组的使用】】

萌新的学习之Numpy数组的使用 先记录一下之前的关于函数的设计 通过创造类的形式 复习完毕之后介绍numpy数组的使用 #整数型数组遇到除法 &#xff08;即便是除以整数&#xff09; 不同维度的数组之间 从外形上的本质区别 一维数组用1层中括号 二维数组用2层中括号 三维数…...

RabbitMQ3.13.x之七_RabbitMQ消息队列模型

RabbitMQ3.13.x之七_RabbitMQ消息队列模型 文章目录 RabbitMQ3.13.x之七_RabbitMQ消息队列模型1. RabbitMQ消息队列模型1. 简单队列2. Work Queues(工作队列)3. Publish/Subscribe(发布/订阅)4. Routing(路由)5. Topics(主题)6. RPC(远程过程调用)7. Publisher Confirms(发布者…...

Android JNI 调用第三方SO

最近一个项目使用了Go 编译了一个so库&#xff0c;但是这个so里面还需要使用第三方so库pdfium, 首先在Android工程把2个so库都放好 在jni中只能使用dlopen方式&#xff0c;其他的使用函数指针的方式来调用&#xff0c;和windows dll类似&#xff0c;不然虽然编译过了但是会崩溃…...

Vid2seq

Vid2Seq 应该是目前为止,个人最中意得一篇能够实际解决对一段视频进行粗略理解得paper了。个人认为它能够真正能解决视频理解是因为它是对一个模型整体做了训练,而不仅仅是通过visual encoders(e.g BLIP/CLIP/…)和 其它multi modal 的encoder直接过了个projection,做一个…...

Opencv人机交互界面设置

Opencv人机交互界面设置 以下是一些常见的OpenCV人机交互界面设置&#xff1a; 窗口交互 显示窗口&#xff1a;可以使用cv2.imshow()函数在屏幕上显示图像。例如&#xff0c;要显示名为“image”的图像&#xff0c;可以使用以下代码&#xff1a; import cv2img cv2.imread…...

蓝桥杯算法心得——字典树考试(贡献度+前缀和)

大家好&#xff0c;我是晴天学长&#xff0c;贡献度的题&#xff0c;找到技巧非常重要&#xff0c;需要的小伙伴可以关注支持一下哦&#xff01;后续会继续更新的。&#x1f4aa;&#x1f4aa;&#x1f4aa; 1) .字典树考试 字典树考试 问题描述 蓝桥学院最近教学了字典树这一数…...

Linux下Qt生成程序崩溃文件

文章目录 1.背景2.Qt编译生成程序2.1.profile模式的本质 3.执行程序&#xff0c;得到core文件4.代码定位4.1.直接使用gdb4.2.使用QtCreator 5.总结6.题外话6.1.profile模式和debug模式的区别 1.背景 在使用Qt时&#xff0c;假如在windows&#xff0c;当软件崩溃时&#xff0c;…...

Go语言中测试和性能

1. 测试:软件开发最重要的方面 测试软件程序可能是软件开发人员能够做的最重要的事情。通过测试代码的功能,开发人员能够在很大程度上确定程序是有效的。另外,每次修改代码后,开发人员都可运行测试,确认没有引入Bug和衰退。通过测试软件,还能够让软件工程师确认程序按期望…...

回归预测 | Matlab基于CPO-GPR基于冠豪猪算法优化高斯过程回归的多输入单输出回归预测

回归预测 | Matlab基于CPO-GPR基于冠豪猪算法优化高斯过程回归的多输入单输出回归预测 目录 回归预测 | Matlab基于CPO-GPR基于冠豪猪算法优化高斯过程回归的多输入单输出回归预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 Matlab基于CPO-GPR基于冠豪猪算法优化高斯…...

python 日期字符串转换为指定格式的日期

在Python编程中&#xff0c;日期处理是一个常见的任务。我们经常需要将日期字符串转换为Python的日期对象&#xff0c;以便进行日期的计算、比较或其他操作。同时&#xff0c;为了满足不同的需求&#xff0c;我们还需要将日期对象转换为指定格式的日期字符串。本文将详细介绍如…...

day03-Docker

1.初识 Docker 1.1.什么是 Docker 1.1.1.应用部署的环境问题 大型项目组件较多&#xff0c;运行环境也较为复杂&#xff0c;部署时会碰到一些问题&#xff1a; 依赖关系复杂&#xff0c;容易出现兼容性问题开发、测试、生产环境有差异 例如一个项目中&#xff0c;部署时需要依…...

C语言函数实现冒泡排序

前言 今天我们来看看怎么使用函数的方式实现冒泡排序吧&#xff0c;我们以一个数组为例arr[] {9,8,7,6,5,4,3,2,1,0},我们将这个数组通过冒泡排序的方式让他变为升序吧。 代码实现 #include<stdio.h> void bubble_sort(int arr[], int sz) {int i 0;for (i 0;i < s…...

区间概率预测python|QR-CNN-BiLSTM+KDE分位数-卷积-双向长短期记忆神经网络-时间序列区间概率预测+核密度估计

区间预测python|QR-CNN-BiLSTMKDE分位数-卷积-双向长短期记忆神经网络-核密度估计-回归时间序列区间预测 模型输出展示&#xff1a; (图中是只设置了20次迭代的预测结果&#xff0c;宽度较宽&#xff0c;可自行修改迭代参数&#xff0c;获取更窄的预测区间&#xff09; 注&am…...

Java 分支结构 - if…else/switch

顺序结构只能顺序执行&#xff0c;不能进行判断和选择&#xff0c;因此需要分支结构。 Java有两种分支结构&#xff1a; if语句switch语句 if语句 一个if语句包含一个布尔表达式和一条或多条语句。 语法 If 语句的用语法如下&#xff1a; if(布尔表达式) {//如果布尔表达…...

别再死记硬背了!用‘知识卡片+思维导图’法搞定离散数学里的命题、谓词与代数系统

知识卡片与思维导图&#xff1a;离散数学的高效学习革命 离散数学常被学生称为"天书"——命题逻辑的符号迷宫、谓词逻辑的量化陷阱、代数系统的抽象森林&#xff0c;每个概念都像一座孤岛。传统线性笔记法让这些知识点在脑海中如散沙般难以聚合&#xff0c;这正是大多…...

请教指针初始化:定义指针时,要么直接指向有效内存,要么置为NULL

在技术领域&#xff0c;我们常常被那些闪耀的、可见的成果所吸引。今天&#xff0c;这个焦点无疑是大语言模型技术。它们的流畅对话、惊人的创造力&#xff0c;让我们得以一窥未来的轮廓。然而&#xff0c;作为在企业一线构建、部署和维护复杂系统的实践者&#xff0c;我们深知…...

H3C交换机三层组网配置保姆级复盘:从拓扑设计到排错命令一条龙

H3C交换机三层组网实战指南&#xff1a;从规划到排错的完整工作流 当企业网络规模逐渐扩大&#xff0c;部门间的隔离与互通需求变得复杂时&#xff0c;二层交换网络往往显得力不从心。这时&#xff0c;三层交换技术的引入就成为网络工程师的必修课。本文将带你深入一个真实的办…...

基于Spring Boot的金融级钱包与支付系统设计与实现

1. 项目概述与核心价值 最近在折腾一个需要集成支付功能的项目&#xff0c;后台管理、用户体系都搭好了&#xff0c;就差一个稳定、灵活且能快速上线的钱包与支付模块。找了一圈开源方案&#xff0c;要么太重&#xff0c;耦合了太多业务逻辑&#xff1b;要么太轻&#xff0c;连…...

JPEXS Flash反编译器技术架构解析:遗留Flash资产现代化迁移方案

JPEXS Flash反编译器技术架构解析&#xff1a;遗留Flash资产现代化迁移方案 【免费下载链接】jpexs-decompiler JPEXS Free Flash Decompiler 项目地址: https://gitcode.com/gh_mirrors/jp/jpexs-decompiler 在数字化转型进程中&#xff0c;大量遗留的Flash应用程序成为…...

免费LLM API集成实战:从选型到构建高可用AI服务

1. 项目概述&#xff1a;一个汇聚免费LLM API的宝藏仓库如果你正在开发一个需要AI对话、文本生成或代码补全功能的应用&#xff0c;但又被高昂的API调用费用或复杂的申请流程劝退&#xff0c;那么你很可能需要这个项目。Clovenhoofed-loadingarea139/awesome-free-llm-apis是一…...

Node.js异步数据库操作:nedb-promises封装原理与实战指南

1. 项目概述&#xff1a;告别回调地狱&#xff0c;拥抱异步数据库操作 如果你在Node.js项目中用过NeDB&#xff0c;大概率对它的回调函数&#xff08;callback&#xff09;模式又爱又恨。NeDB本身是一个轻量级的嵌入式数据库&#xff0c;API设计简单直观&#xff0c;但在现代异…...

CANN/ops-nn自适应层归一化算子

AdaLayerNorm 【免费下载链接】ops-nn 本项目是CANN提供的神经网络类计算算子库&#xff0c;实现网络在NPU上加速计算。 项目地址: https://gitcode.com/cann/ops-nn 产品支持情况 产品是否支持Ascend 950PR/Ascend 950DTAtlas A3 训练系列产品/Atlas A3 推理系列产品√…...

基于PyTorch的图像分类实战:从数据增强到模型微调全流程解析

1. 项目概述&#xff1a;一个基于深度学习的开源图像识别工具最近在整理个人项目库时&#xff0c;翻到了一个挺有意思的仓库&#xff0c;叫jyao97/xylocopa。乍一看这个名字&#xff0c;可能有点摸不着头脑&#xff0c;但如果你对昆虫学或者开源项目命名有点了解&#xff0c;就…...

《如果你还愿意等》的搜索理由:等待场景怎样被记住

从内容传播角度看&#xff0c;《如果你还愿意等》的优势在于语气。它不是命令&#xff0c;也不是苦情控诉&#xff0c;而是把等待放成一个“如果”&#xff1a;有余地&#xff0c;也有边界。这个标题能自然带出使用场景&#xff1a;未读消息、夜车灯光、异地关系、还没完全离开…...