LeetCode 热题 100 | 双指针(下)

目录

42. 接雨水

1  方法一:我的方法

2  方法二:动态规划

3  方法三:双指针


菜鸟做题第一周,语言是 C++

42. 接雨水

1  方法一:我的方法

Warning:这是我的智障做法,请勿模仿

我只能说它教会了我 “&&” 是从左到右进行判断的,第一个不成立就不会看第二个了。当判断条件顺序写反时,即使我写了防止指针越界的约束条件,它也压根看不到。最后就会这样:

解题思路:

  1. 正向遍历,算每个下标的积水高度(绿色面积)
  2. 反向遍历,算每个下标的积水高度(红色面积)
  3. 取每个下标的积水高度的较小值即为真实积水高度(阴影面积)

力扣官方说明图:

class Solution {
public:int trap(vector<int>& height) {int left = 0, right = 0, rain = 0;unordered_map<int, int> forward, backward;// 正向遍历while (left <= height.size() - 1) {while (right <= height.size() - 1 && height[left] >= height[right])++right;if (left + 1 <= height.size() - 1 && height[left] > height[left + 1]) {int temp = left + 1;while (temp < right) {forward[temp] = height[left] - height[temp];++temp;}left = right - 1;}++left;}// 反向遍历left = height.size() - 1, right = height.size() - 1;while (right >= 0) {while (left > 0 && height[left] <= height[right])--left;if (right - 1 >= 0 && height[right] > height[right - 1]) {int temp = right - 1;while (temp > left) {backward[temp] = height[right] - height[temp];--temp;}right = left + 1;}--right;}// 计算雨水for (int i = 0; i < height.size() - 1; ++i) {rain += min(forward[i], backward[i]);}return rain;}
};

2  方法二:动态规划

解题思路:

  1. 正向遍历,算每个区域的局部最大高度(绿色)
  2. 反向遍历,算每个区域的局部最大高度(红色)
  3. 取每个下标的最大高度的较小值再减该下标的高度
  4. 总和为 rain 积水量

事实证明是我没有彻底理解官方题解的思路,所以才搞出了方法一这种智障解法。

力扣官方说明图:

class Solution {
public:int trap(vector<int>& height) {int n = height.size();vector<int> leftMax(n), rightMax(n);if (n == 0) return 0;// 正向遍历leftMax[0] = height[0];for (int i = 1; i < n; ++i) {leftMax[i] = max(leftMax[i - 1], height[i]);}// 反向遍历rightMax[n - 1] = height[n - 1];for (int i = n - 2; i >= 0; --i) {rightMax[i] = max(rightMax[i + 1], height[i]);}// 计算雨水int rain = 0;for (int i = 0; i < n; ++i) {rain += min(leftMax[i], rightMax[i]) - height[i];}return rain;}
};

3  方法三:双指针

思路说明:

方法二是完成正向遍历和反向遍历后才来计算 rain 积水量,而方法三是利用双指针一左一右同时开始遍历,并且可以直接计算 rain 积水量。

由于每次移动前都立即计算了:

leftMax = max(leftMax, height[left]);
rightMax = max(rightMax, height[right]);

所以下面的两个不等式成立:

  • 若 height[left] < height[right],则必有 leftMax < rightMax
  • 若 height[left] > height[right],则必有 leftMax > rightMax

那么就可以直接计算 rain 积水量了:

  • 若 height[left] < height[right],则 rain += leftMax - height[left]
  • 若 height[left] > height[right],则 rain += rightMax - height[right]

一开始我觉得很难理解,但是动动笔写一下,就知道不等式成立了。比如,对于第一个不等式,就可能存在 height[left] < leftMax < rightMax < height[right] 或者 leftMax < height[left] < rightMax < height[right] 等情形,它们都会使不等式成立。

class Solution {
public:int trap(vector<int>& height) {int n = height.size(), rain = 0;if (n == 0) return 0;int leftMax = 0, rightMax = 0;int left = 0, right = n - 1;while (left != right) {leftMax = max(leftMax, height[left]);rightMax = max(rightMax, height[right]);if (height[left] < height[right]) {rain += leftMax - height[left];++left;} else {rain += rightMax - height[right];--right;}}return rain;}
};

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/417921.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Oracle 12CR2 RAC部署翻车,bug避坑经历

&#x1f4e2;&#x1f4e2;&#x1f4e2;&#x1f4e3;&#x1f4e3;&#x1f4e3; 哈喽&#xff01;大家好&#xff0c;我是【IT邦德】&#xff0c;江湖人称jeames007&#xff0c;10余年DBA及大数据工作经验 一位上进心十足的【大数据领域博主】&#xff01;&#x1f61c;&am…

R 语言学习 case3:柱状图(ggchart)

主要涉及到对图的优化&#xff0c;使用ggchart工具包 ggchart 链接&#xff1a;https://thomas-neitmann.github.io/ggcharts/index.html step1: 安装工具包 install.packages("ggcharts") install.packages("tidytext")step2: 导入工具包 library(dplyr…

web渗透安全学习笔记:2、HTML基础知识

目录 前言 HTML的标题 段落链接与插入图片 HTML元素 HTML属性 HTML头部 HTML与CSS HTML与JavaScript 表格与列表 HTML区块 布局 HTML表单 HTML与数据库 音频与视频 HTML事件 前言 HTML的标题 <!DOCTYPE html> <html> <head> <meta chars…

Appium 环境配置

Appium 是一个开源的、跨平台的测试框架&#xff0c;可以用来测试 Native App、混合应用、移动 Web 应用&#xff08;H5 应用&#xff09;等&#xff0c;也是当下互联网企业实现移动自动化测试的重要工具。Appium 坚持的测试理念&#xff1a; •无需用户对 App 进行任何修改或…

[嵌入式软件][入门篇][仿真平台] STM32F103实现LED、按键

上一篇&#xff1a;[嵌入式软件][入门篇] 搭建在线仿真平台(STM32) 文章目录 一、点亮LED灯(1) 简介(2) 示例代码(3) 仿真效果&#xff08;闪烁&#xff09; 二、按键检测(1) 简介1. 按键原理2. 检测按键端口3. 消抖 (2) 示例代码1 &#xff08;按下点亮&#xff0c;松开熄灭&a…

网络安全等级保护测评规划与设计

笔者单位网络结构日益复杂&#xff0c;应用不断增多&#xff0c;使信息系统面临更多的风险。同时&#xff0c;网络攻防技术发展迅速&#xff0c;攻击的技术门槛随着自动化攻击工具的应用也在不断降低&#xff0c;勒索病毒等未知威胁也开始泛滥。基于此&#xff0c;笔者单位拟进…

k8s资源介绍

Kubernetes架构图 Kubernetes系统用于管理分布式节点集群中的微服务或容器化应用程序&#xff0c;并且其提供了零停机时间部署、自动回滚、缩放和容器的自愈&#xff08;其中包括自动配置、自动重启、自动复制的高弹性基础设施&#xff0c;以及容器的自动缩放等&#xff09;等…

山西电力市场日前价格预测【2024-01-21】

日前价格预测 预测说明&#xff1a; 如上图所示&#xff0c;预测明日&#xff08;2024-01-21&#xff09;山西电力市场全天平均日前电价为266.42元/MWh。其中&#xff0c;最高日前电价为359.17元/MWh&#xff0c;预计出现在08:15。最低日前电价为0.00元/MWh&#xff0c;预计出…

查询指定日期是否为法定工作日的服务接口

在现代社会中&#xff0c;人们的工作与生活节奏日益加快&#xff0c;为了更好地规划工作与休息时间&#xff0c;在开发应用软件时&#xff0c;通过查询指定日期是否为法定工作日的服务接口是一个非常有用的功能。本文将介绍一个API接口&#xff0c;可以根据国家的放假安排来判断…

【大数据Hive】hive 行列转换使用详解

目录 一、前言 二、使用场景介绍 2.1 使用场景1 2.2 使用场景2 三、多行转多列 3.1 case when 函数 语法一 语法二 操作演示 3.2 多行转多列操作演示 四、多行转单列 4.1 concat函数 语法 4.2 concat_ws函数 语法 4.3 collect_list函数 语法 4.4 collect_set函…

Python学习之路——模块

一、什么是模块 python模块&#xff08;Module&#xff09;是一个Python文件&#xff0c;以.py结尾。模块能定义函数、类和变量&#xff0c;模块里也能包含可执行的代码。 二、模块的作用 Python中有很多各种不同的模块&#xff0c;每一个模块都可以帮助我们实现一些功能&am…

SpringBoot项目中简单使用虚拟机Redis

目录 步骤大致如下&#xff1a; 一.在pom文件中加入redis依赖 二.在虚拟机上打开我们下载好的Redis。开启服务器端并获取虚拟机ip地址 三.在项目配置。 四&#xff1a;使用redis 测试 redis是一个以键值对存储的NoSQL。被数百万开发人员用作缓存、矢量数据库、文档数据库、…