力扣hot100 -- 双指针

目录

🎂移动零

🌙盛最多水的容器

🌼三数之和

🌼接雨水

前缀和 + 辅助数组

双指针

单调栈


🎂移动零

283. 移动零 - 力扣(LeetCode)

关于swap

#include <iostream>
#include <vector>
#include <algorithm>int main() {std::vector<int> vec = {1, 2, 3, 4, 5, 6, 7};// 交换 vec 中第 1 个和第 7 个元素std::swap(vec[0], vec[6]);// 输出交换后的结果for (const auto &num : vec) {std::cout << num << " ";}std::cout << std::endl;return 0;
}
7 2 3 4 5 6 1

思路

i = 0, j = 0

为了保证 0 都在末尾,且顺序不变

i 指向 0 && j 指向 非0 元素时

交换两者(交换后,nums[x] <= i 都是非0元素; i < nums[x] <= j,都是 0)

力扣核心代码模式,很容易越界,所以vector遍历时,要注意数组下标的问题 

AC  代码

O(n) 

class Solution {
public:void moveZeroes(vector<int>& nums) {int i = 0, j = 0, n = nums.size();while (j < n && i < n) {if (!nums[i] && nums[j]) swap(nums[i], nums[j]);if (nums[i] != 0) i++; // 索引自增放后面,防止越界j++;}}
};

🌙盛最多水的容器

11. 盛最多水的容器 - 力扣(LeetCode)

 i = 0, j = n - 1

ans = 距离 * 短板长度

所以,移动长板,距离变小,短板长度不可能变大,ans↓

只能移动短板

O(n) 

class Solution {
public:int maxArea(vector<int>& height) {int ans = 0, n = height.size();int i = 0, j = n - 1;while (i < j) {int Min = min(height[i], height[j]); // 短板长度ans = max(ans, Min * (j - i));if (height[i] <= height[j]) i++;else j--;}return ans;}
};

🌼三数之和

15. 三数之和 - 力扣(LeetCode)

思路

外层 for 遍历 i

内层 l, r 双指针

if( + +  == 0) 此时 l 和 r 都需要移动

否则,根据 > 0 或 < 0

只移动一个即可

 关于去除重复解

1)
if (i > 0 && nums[i] == nums[i - 1])continue;2)
while (l < r && nums[l] == nums[l + 1])l++; // 重复解
while (l < r && nums[r] == nums[r - 1])r--; // 重复解

1) 去掉下标 i 的重复解

2) 去掉下标 l, r 的重复解

AC  代码 

class Solution {
public:vector<vector<int>> threeSum(vector<int>& nums) {if (nums.size() < 3) return {}; // 返回空数组vector<vector<int> > ans;sort(nums.begin(), nums.end()); // 排序int n = nums.size();for (int i = 0; i < n - 2; ++i) { // i l rif (nums[i] > 0) return ans; // 直接返回已有答案if (i > 0 && nums[i] == nums[i - 1])continue; // 去除重复解int l = i + 1, r = n - 1;while (l < r) { // 双指针循环判断if (nums[i] + nums[l] + nums[r] == 0) {ans.push_back({nums[i], nums[l], nums[r]});while (l < r && nums[l] == nums[l + 1])l++; // 重复解while (l < r && nums[r] == nums[r - 1])r--; // 重复解l++, r--; // 上面while结束后,还需要再移动一次}else if (nums[i] + nums[l] + nums[r] > 0)r--;elsel++;}}return ans;}
};

🌼接雨水

42. 接雨水 - 力扣(LeetCode)

前缀和 + 辅助数组

辅助数组 l[] 和 r[]

思路

每个柱子能盛水的高度,取决于左边最高和右边最高的柱子的短板

具体就是,min(l[i], r[i]) - h[i]

ans[] 可以省略,直接 res += ...

O(n) * 3

class Solution {
public:int trap(vector<int>& h) {int n = h.size();// ans[] 某一根柱子上的雨水vector<int> ans(n), l(n), r(n); // l[] 左边开始最高点, r[] 右边开始最高点l[0] = h[0], r[n - 1] = h[n - 1]; // 这里的赋值,需要以上面的分配空间为前提for (int i = 1; i < n; ++i) l[i] = max(l[i - 1], h[i]); // 上一个l[]或当前h[] 取最大值for (int i = n - 2; i >= 0; --i)r[i] = max(r[i + 1], h[i]);// 对比 h[] 和 l[] / r[] 得到每个柱子接的雨水int res = 0;for (int i = 1; i < n - 1; ++i) // i==0 或 i==n-1,肯定没有雨水if (h[i] < l[i] && h[i] < r[i])res += min(l[i], r[i]) - h[i];return res;}
};

双指针

在  前缀和  思路的基础上,用两个指针 left, right 和两个变量 l_max, r_max ,代替两个辅助数组

优化空间复杂度 O(n) --> O(1)

补充解释

前缀和,是顺序遍历所有柱子

而双指针,是两个指针 left(顺序) 和 right(逆序),双向同时向中间遍历

取较小那边的 max 值,用那边的 max 值,减去那边当前柱子的高度的 h[] 

为什么要选  较小  那边的来计算呢?(关键是  当前  两个字)

因为对于 当前的 left 或者 right 来说,较小那边的,一定是制约当前柱子雨水量的  短板

对照着理解下👈

AC  代码

O(n) * 1

class Solution {
public:int trap(vector<int>& h) {int n = h.size(), res = 0;int l = 0, r = n - 1, l_max = 0, r_max = 0;while (l < r) { l_max = max(h[l], l_max);r_max = max(h[r], r_max);// 注意 += 操作完后,对应一边的指针(l 或 r)要移动res += (l_max < r_max) ? (l_max - h[l++]) : (r_max - h[r--]); // 减去对应一边的柱子}return res;}
};

单调栈

简介

单调栈 - OI Wiki (oi-wiki.org)

模拟 

单调栈【基础算法精讲 26】_哔哩哔哩_bilibili

思路 

42. 接雨水 - 力扣(LeetCode)

力扣官方视频 -- 4'56开始看,13'56结束(9分钟)

关于代码中 st.pop() 以及 distance(积水宽度) 的计算👇 结合图理解

实际就是对单调栈的模拟,结合  += ( min(h1, h2) - h ) * 宽,即,(短板 - 当前) * 宽度 

过程

1)单调递减栈,储存可能形成 “低洼处” 的柱子

2)遇到更低的柱子,就插入 索引

3)遇到更高的柱子,意味着和前面 更低的,形成了低洼,就进入 内层 while 循环计算积水

4)被弹出的索引 top,h[top] 作为被积水的柱子高度,弹出栈顶后的新栈顶 left,作为 左端点

5)右端点即 当前 for 循环的 i, i - left - 1 即 积水宽度

6)高度取 当前高度 h[i] 和 左端点高度 h[left] 的 较小值

7)积水高度即,min( h[i], h[left] ) - h[top]

8)接着用积水 高度 * 宽度,即得到 += 的积水

9)while ( 栈非空 && 当前高度 h[i] > 栈顶高度 h[st.top()] ) ,重复 (3) ~ (8)

AC  代码

class Solution {
public:int trap(vector<int>& h) {stack<int> st; // 存储下标int n = h.size(), ans = 0;for (int i = 0; i < n; ++i) {while (!st.empty() && h[st.top()] < h[i]) { // 满足 低洼处 条件int top = st.top();st.pop(); // 弹出栈顶if (st.empty()) break; // 左边没有更高的柱子来形成积水int left = st.top();int height = min(h[i], h[left]) - h[top];int width = i - left - 1;ans += height * width;}// stack, queue 都是 push, vector 才是 push_backst.push(i); // 高度降低, 直接插入}return ans;}
};

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

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

[SAP] ABAP设置非系统关键字代码提示功能

在事务码SE38(ABAP编辑器)屏幕右下角&#xff0c;点击【Options选项】图标 勾选【代码完成】|【建议文本中的非关键字】&#xff0c;并点击【保存】按钮 在下面的程序代码中&#xff0c;当我需要输入在11行的位置输入非关键字lv_str的时候&#xff0c;会有非关键字代码提示的功…

STM32 cubemx配置DMA+空闲中断接收不定长数据

文章目录 前言一、串口空闲中断二、DMA空闲中断接收不定长数据实现思路三、STM32Cubemx配置DMA空闲中断接收不定长数据四、代码编写总结 前言 本篇文章给大家讲解一下DMA串口空闲中断接收串口不定长数据&#xff0c;之前我们也是讲解过串口接收不定长数据的&#xff0c;那么本…

从Socket中解析Http协议实现通信

在网络协议中&#xff0c;Socket是连接应用层和运输层的中间层&#xff0c;主要作用为了通信。Http协议是应用层上的封装协议。我们可以通过Http协议的规范解析Socket中数据&#xff0c;完成Http通信。 首先&#xff0c;我们先回顾一下Http协议的规范。主要复习一下&#xff0c…

“OLED屏幕,色彩绚丽,画面清晰,让每一帧都生动无比。“#IIC协议【下】

"OLED屏幕&#xff0c;色彩绚丽&#xff0c;画面清晰&#xff0c;让每一帧都生动无比。"#IIC协议【下】 前言预备知识1. OLED显示一个点代码实现1.1 OLED显示一个点代码实现核心思路1.2和LCD1602一样需要初始化&#xff0c;看手册&#xff0c;写初识化函数1.3选择Pag…

知到答案在哪搜? #微信#笔记#其他

学习工具是我们的得力助手&#xff0c;帮助我们更好地组织学习内容和时间。 1.试题猪 这是一个公众号 总体来说还是很不错的&#xff0c;题库虽然不是特别全&#xff0c;但是大部分网课答案能够查询到&#xff0c;最重要的是免费的 下方附上一些测试的试题及答案 1、实验室…

C语言函数的栈帧与销毁(面试亮点)

目录 如果你能熟练的掌握函数的栈帧与销毁在面试中是及其亮眼的加分项&#xff0c;所以我们来以实例来将解函数是如何实现栈帧与销毁的。 一. 函数栈帧 二.寄存器 三. 用例题讲解创建栈帧的过程 3.1 main 函数的反汇编代码。 第一步&#xff1a;给调用main函数的函数分配…

STL之list容器的介绍与模拟实现+适配器

STL之list容器的介绍与模拟实现适配器 1. list的介绍2. list容器的使用2.1 list的定义2.2 list iterator的使用2.3 list capacity2.4 list element access2.5 list modifiers2.6 list的迭代器失效 3. list的模拟实现3.1 架构搭建3.2 迭代器3.2.1 正向迭代器3.2.2反向迭代器适配…

大脑是宇宙中最复杂的物体——科学家们试图破译它,读懂人们的思想

2023年&#xff0c;德克萨斯大学HuthLab进行的一项研究在神经科学和技术领域引发了震动。通过人工智能(AI)和脑成像技术的结合&#xff0c;无法与外界交流的人的思想首次被翻译成连续的自然语言。 这是迄今为止最接近读心术的科学方法。在过去的二十年里&#xff0c;神经成像技…

Qt中程序发布及常见问题

1、引言 当我们写好一个程序时通常需要发布给用户使用&#xff0c;那么在Qt中程序又是如何实现发布的呢&#xff0c;这里我就来浅谈一下qt中如何发布程序&#xff0c;以及发布程序时的常见问题。 2、发布过程 2.1、切换为release模式 当我们写qt程序时默认是debug模式&#x…

【51单片机】添加模块代码的常见问题(图示&代码演示)

前言 大家好吖&#xff0c;欢迎来到 YY 滴 系列 &#xff0c;热烈欢迎&#xff01; 本章主要内容面向接触过C的老铁 主要内容含&#xff1a; 本章节是Lcd1602章节的一部分&#xff0c;以把4个Lcd驱动程序添加为例子&#xff0c;完整传送门在下方传送门 欢迎订阅 YY滴C专栏&…

Red Panda Dev C++ Maker【2.0自创黑客版】使用说明

https://download.csdn.net/download/HappyStarLap/88825258https://download.csdn.net/download/HappyStarLap/88825258Red Panda Dev C&#xff08;旧名 Dev-C 2000&#xff09;是 Orwell Dev-C 的改进分支。包括heker.h、Heike.h、easxy.h 和Art_Text.h。Orwell Dev-C 自 20…

(三)elasticsearch 源码之启动流程分析

https://www.cnblogs.com/darcy-yuan/p/17007635.html 1.前面我们在《&#xff08;一&#xff09;elasticsearch 编译和启动》和 《&#xff08;二&#xff09;elasticsearch 源码目录 》简单了解下es&#xff08;elasticsearch&#xff0c;下同&#xff09;&#xff0c;现在我…

基于tomcat运行jenkins常见的报错处理

目录 1.jenkins.util.SystemProperties$Listener错误 升级jdk11可能遇到的坑 2.java.lang.RuntimeException: Fontconfig head is null, check your fonts or fonts configuration 3.There were errors checking the update sites: UnknownHostException:updates.jenkins.i…

Apache Zeppelin 整合 Spark 和 Hudi

一 环境信息 1.1 组件版本 组件版本Spark3.2.3Hudi0.14.0Zeppelin0.11.0-SNAPSHOT 1.2 环境准备 Zeppelin 整合 Spark 参考&#xff1a;Apache Zeppelin 一文打尽Hudi0.14.0编译参考&#xff1a;Hudi0.14.0 最新编译 二 整合 Spark 和 Hudi 2.1 配置 %spark.confSPARK_H…

Netty应用(三) 之 NIO开发使用 网络编程 多路复用

目录 重要&#xff1a;logback日志的引入以及整合步骤 5.NIO的开发使用 5.1 文件操作 5.1.1 读取文件内容 5.1.2 写入文件内容 5.1.3 文件的复制 5.2 网络编程 5.2.1 accept&#xff0c;read阻塞的NIO编程 5.2.2 把accept&#xff0c;read设置成非阻塞的NIO编程 5.2.3…

低代码平台与BPM:两者是否具有可比性?

传统上&#xff0c;业务流程管理 (BPM) 系统通过消除手动重复工作来帮助企业简化复杂的流程。它用于自动化、监控和分析业务流程&#xff0c;使高层管理人员的工作更轻松。这反过来又提高了所有其他相关利益相关者的生产力&#xff0c;并为业务增长铺平了道路。BPM 软件还使决策…

springboot174基于springboot的疾病防控综合系统的设计与实现

简介 【毕设源码推荐 javaweb 项目】基于springbootvue 的 适用于计算机类毕业设计&#xff0c;课程设计参考与学习用途。仅供学习参考&#xff0c; 不得用于商业或者非法用途&#xff0c;否则&#xff0c;一切后果请用户自负。 看运行截图看 第五章 第四章 获取资料方式 **项…

Linux-3 进程概念(三)

1.环境变量 1.1基本概念 环境变量(environment variables)一般是指在操作系统中用来指定操作系统运行环境的一些参数 如&#xff1a;我们在编写C/C代码的时候&#xff0c;在链接的时候&#xff0c;从来不知道我们的所链接的动态静态库在哪里&#xff0c;但是照样可以链接成功…

初识Solidworks:我的第一份作业的感想

从来没用CAD软件画过机械设计图。但我脑子里有一种概念&#xff0c;无非就是把尺规作图软件化&#xff0c;更方便画图、更方便修改、更方便打印一些。但第一份 Solidworks 作业就颠覆了我的认知&#xff0c;考虑到这个软件的上市时间&#xff0c;让我意识到自己对 CAD 软件的认…

如何让内网client通过公网地址访问内网server?

第一步&#xff0c;实现任意公网用户访问内网server。按教育网规矩&#xff0c;公网过来的流量要访问校内网的server必须从教育专线&#xff08;路由器接口G0/0/1)进入。 第二步&#xff0c;实现内网主机通过公网地址210.43.2.3能够访问内网server192.168.1.2&#xff0c;图中①…