刷题技巧:双指针法的核心思想总结+例题整合+力扣接雨水双指针c++实现
双指针法的核心思想是通过同时操作两个指针来遍历数据结构,通常是数组或链表,以达到优化算法性能的目的。具体来说,双指针法能够减少时间复杂度、空间复杂度,或者简化逻辑结构。以下是双指针法的几个核心思想:
ps 下面提到的“应用场景”:在力扣中都有原题!
- 两端逼近:
- 核心思想:通过设置两个指针,一个从数据结构的左端开始,一个从右端开始,然后根据一定的条件向中间移动这两个指针,从而逐步缩小问题的规模。
- 应用场景:如数组中的“二分搜索”、“盛水最多的容器(Container with Most Water)”、以及“接雨水(Trapping Rain Water)”等问题。
- 优势:避免了多次嵌套循环或者重复遍历,从而将时间复杂度从 O(n^2) 降到 O(n)。
- 快慢指针:
- 核心思想:设置两个指针,一个指针每次移动一步(慢指针),另一个指针每次移动两步或更多(快指针)。通过这种方式,可以在一次遍历中同时完成多项任务。
- 应用场景:如链表中的“环检测(Cycle Detection)”问题、寻找链表的中间节点等。
- 优势:通过一次遍历同时获取多种信息,提高了效率。
- 滑动窗口:
- 核心思想:使用两个指针定义一个窗口,窗口可以向前滑动以覆盖不同的子区间。这种方法常用于解决涉及子数组或子字符串的问题,如“最长子串”、“最小覆盖子串”等。
- 应用场景:如“最小覆盖子串(Minimum Window Substring)”、“无重复字符的最长子串(Longest Substring Without Repeating Characters)”等。
- 优势:在处理连续子区间问题时,可以在 O(n) 时间复杂度内完成解决方案。
- 分割与合并:
- 核心思想:将问题分解为左右两部分,通过双指针分别处理这两部分,并在合适的时候合并结果。
- 应用场景:如“归并排序(Merge Sort)”、“两个有序数组的合并”等。
优势:可以有效处理有序数组或链表的合并问题,保证合并后的结果依然有序。
- 条件判断与指针移动:
- 核心思想:通过条件判断决定哪个指针移动,以逐步逼近或找到符合条件的解。
- 应用场景:如“二分查找”、“两数之和(Two Sum)”问题。
- 优势:能够快速收敛到问题的解,避免不必要的遍历和计算。
总结:
双指针法的核心在于利用两个指针的协作,通过合理的移动策略来减少问题的规模或提高问题的求解效率。其应用非常广泛,可以显著优化涉及数组、链表等线性结构的问题,尤其在需要高效处理子区间、子序列、或寻找特定条件下的元素时尤为有效。
这种方法的优势在于线性遍历能够在保持结果正确性的同时,减少算法的复杂度,是处理各种线性问题时的一个非常有力的工具。
例题:力扣接雨水接雨水


双指针代码+详细注释:
- 重点1,利用双指针的好处就是自然完成遍历!(两个指针相交就便利完成)
- 重点2:按列来计算!
class Solution {
public:int trap(vector<int>& height) {// 获取数组的长度int n = height.size();// 如果数组为空,则没有可以积水的地方,直接返回0if (n == 0) return 0;// 初始化两个指针,分别指向数组的两端int left = 0, right = n - 1;// 初始化左边和右边的最大高度int leftMax = 0, rightMax = 0;// 初始化结果,存储最终的积水量int waterTrapped = 0;// 当左指针小于右指针时,继续循环while (left < right) {// 如果左边的高度小于右边的高度,则说明左边可以计算水洼if (height[left] < height[right]) {// 如果当前左边的高度大于或等于leftMax,则更新leftMaxif (height[left] >= leftMax) {leftMax = height[left];} else {// 否则,则必定形成小水洼!计算当前左边位置能存储的水量,并累加到waterTrapped中waterTrapped += leftMax - height[left];}// 左指针向右移动left++;} else {// 如果右边的高度小于或等于左边的高度if (height[right] >= rightMax) {// 如果当前右边的高度大于或等于rightMax,则更新rightMaxrightMax = height[right];} else {// 否则,计算当前右边位置能存储的水量,并累加到waterTrapped中waterTrapped += rightMax - height[right];}// 右指针向左移动right--;}}// 返回计算得到的总积水量return waterTrapped;}
};相关文章:
刷题技巧:双指针法的核心思想总结+例题整合+力扣接雨水双指针c++实现
双指针法的核心思想是通过同时操作两个指针来遍历数据结构,通常是数组或链表,以达到优化算法性能的目的。具体来说,双指针法能够减少时间复杂度、空间复杂度,或者简化逻辑结构。以下是双指针法的几个核心思想: ps 下面…...
什么是前端微服务,有何优势
随着互联网技术的发展,传统的单体应用架构已经无法满足复杂业务场景的需求。微服务架构的兴起为后端应用的开发和部署提供了灵活性和可扩展性。与此同时,前端开发也经历了类似的演变,前端微服务作为一种新兴的架构模式应运而生。 一、前端微服…...
小论文写作——02:编故事
一篇论文,可以发水刊,也可以发顶刊顶会,这两者的区别就是一个故事编的好不好。 你的论文ABC,但不能之说有ABC。创新就是看你故事编的怎么样?创新是编出来的。 我们要说:我发现了问题,然后准备…...
GIT企业开发使用介绍
0.认识git git就是一个版本控制器,记录每次的修改以及版本迭代的一个管理系统 至于为什么会有git的出现,主要是为了解决一份代码改了又改,但最后还是要第一版的情况 git 可以控制电脑上所有格式的文档 1.安装git sudo yum install git -y…...
文件上传-前端验证
查看源代码(找验证代码) 1、源代码直接找到验证代码 示例: function checkFileExt(filename){var flag false; //状态var arr ["jpg","png","gif"]; //允许上传的文件//取出上传文件的扩展名var index f…...
ROT加密算法login-RESERVE
ROT算法(字母轮换加密) 也称为Caesar加密,是一种简单的字母替换加密算法。它通过将字母表中的每个字母向后(或向前)移动固定的位置来加密文本。 加密步骤: 选择一个固定的偏移量(通常是1到25之间的整数)&…...
C++ 新特性 | C++20 常用新特性介绍
目录 1、模块(Modules) 2、协程(Coroutines) 3、概念(Concepts) 4、范围(Ranges) 5、三向比较符(three-way comparison) C软件异常排查从入门到精通系列教程(专栏文章列表,欢迎订阅,持续更新...)https…...
Java设计模式之策略模式实践
1、策略接口 /*** 策略接口*/ public interface DemoStrategy {Result execute(); } 2、策略工厂 /*** 策略工厂*/ Component public class DemoFactory {Resourceprivate final Map<String, DemoStrategy> demoStrategy new ConcurrentHashMap<>();public Demo…...
C语言——结构体数组、结构体指针、结构体函数与二级指针
C语言中的结构体(struct)是一种用户自定义的数据类型,它允许你将不同类型的数据项组合成一个单一的类型。结构体数组则是一种特殊的数组,其元素为结构体类型。这意味着你可以在一个数组中存储多个具有相同结构的记录。 定义结构体…...
【4】策略模式
如上图所示,如果要加入一个新的货币,那么就需要对类中的Calculate函数进行修改,这违背了封闭开放原则。 上图中的方式更加合适,搞一个抽象类(方法中可以用多态调用),然后每个货币自己是一个类&a…...
BGP 反射器联邦实验
要求: 1.如图连接网络,合理规划IP地址,AS 200内IGP协议为OSPF 2.R1属于AS 100;R2-R3-R4小AS 234 R5-R6-R7小AS 567,同时声明大AS 200,R8属于AS 300 3.R2-R5 R4-R7 之间为联邦EBGP邻居关系 4.R1-R8之…...
stm32入门学习13-时钟RTC
(一)时钟RTC stm32内部集成了一个秒计数器RTC,用于显示我们日常的时间,如日期年月日,时分秒等,RTC的主要原理就是进行每秒自增,如果我们知道开始记秒的开始时间,就可以计算现在的日…...
vuex properties of undefined (reading ‘getters‘)
前言: 最近打算用vue 写个音乐播放器,在搞 vuex 的时候遇到一个很神奇报错;vuex 姿势练了千百次了,刚开始的时候我一直以为是代码问题,反复检查了带了,依旧报错。 Error in mounted hook: "TypeError:…...
再谈表的约束
文章目录 自增长唯一键外键 自增长 auto_increment:当对应的字段,不给值,会自动的被系统触发,系统会从当前字段中已经有的最大值1操作,得到一个新的不同的值。通常和主键搭配使用,作为逻辑主键。 自增长的…...
认识一下测试策略与测试方案
目录 测试方案 测试策略 测试策略的内容主要包括 测试技术和工具 测试启动、停止和完成标准 风险分析和应对方案 测试范围 测试角色和职责 测试方法和类型 测试工具 测试层级 测试指标 测试可交付成果 测试方案的内容包括 测试目标 测试范围 测试环境 测试策略…...
Gradle 查看包的依赖关系
在 Terminal 中可以通过 gradle 的命令查看项目中使用的依赖库及其版本,并且可以更加直观的看到各个模块中库之间的依赖关系。同时也可以跟踪并解决与库版本冲突有关的问题。 工具查看 在 Android Studio 中选择 View > Tool Windoors > Gradle 或者直接选择…...
虚幻5|给攻击添加特效
一,打开武器蓝图 选择武器网格体,在细节处找到组件开始重叠,点击 写下以下蓝图,这是最终蓝图,后面会分讲要点 二,actor拥有标签,就是被击打的敌人,我们给actor添加标签 到主界面&am…...
Delphi包管理与依赖:掌握GetIt与DelphiPI的艺术
标题:Delphi包管理与依赖:掌握GetIt与DelphiPI的艺术 在Delphi的广袤生态中,包管理和依赖解决方案是构建大型项目不可或缺的工具。本文将深入探讨Delphi中的两种主要包管理工具:GetIt包管理器和DelphiPI,通过实际代码…...
如何使用unittest和pytest进行python脚本的单元测试
1. 关于unittest和pytest unittest是python内置的支持单元测试的模块,他提供了核心类,TestCase,让单元测试 代码的编写不再是从0开始,不再是作坊式,而是标准化,模板化,工厂化。 pytest是第三方…...
Java中的值传递与引用传递
Java中的值传递与引用传递 在Java编程中,理解值传递与引用传递的概念是编写无误代码的关键。这两个概念有时会让人感到困惑,特别是当它们与对象有关时。现在,我们将一步步地解释这两个概念,帮助你彻底理解它们。 1. 值传递与引用…...
网络编程(Modbus进阶)
思维导图 Modbus RTU(先学一点理论) 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议,由 Modicon 公司(现施耐德电气)于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…...
如何在看板中有效管理突发紧急任务
在看板中有效管理突发紧急任务需要:设立专门的紧急任务通道、重新调整任务优先级、保持适度的WIP(Work-in-Progress)弹性、优化任务处理流程、提高团队应对突发情况的敏捷性。其中,设立专门的紧急任务通道尤为重要,这能…...
Rust 开发环境搭建
环境搭建 1、开发工具RustRover 或者vs code 2、Cygwin64 安装 https://cygwin.com/install.html 在工具终端执行: rustup toolchain install stable-x86_64-pc-windows-gnu rustup default stable-x86_64-pc-windows-gnu 2、Hello World fn main() { println…...
在 Spring Boot 项目里,MYSQL中json类型字段使用
前言: 因为程序特殊需求导致,需要mysql数据库存储json类型数据,因此记录一下使用流程 1.java实体中新增字段 private List<User> users 2.增加mybatis-plus注解 TableField(typeHandler FastjsonTypeHandler.class) private Lis…...
【Linux手册】探秘系统世界:从用户交互到硬件底层的全链路工作之旅
目录 前言 操作系统与驱动程序 是什么,为什么 怎么做 system call 用户操作接口 总结 前言 日常生活中,我们在使用电子设备时,我们所输入执行的每一条指令最终大多都会作用到硬件上,比如下载一款软件最终会下载到硬盘上&am…...
对象回调初步研究
_OBJECT_TYPE结构分析 在介绍什么是对象回调前,首先要熟悉下结构 以我们上篇线程回调介绍过的导出的PsProcessType 结构为例,用_OBJECT_TYPE这个结构来解析它,0x80处就是今天要介绍的回调链表,但是先不着急,先把目光…...
【大模型】RankRAG:基于大模型的上下文排序与检索增强生成的统一框架
文章目录 A 论文出处B 背景B.1 背景介绍B.2 问题提出B.3 创新点 C 模型结构C.1 指令微调阶段C.2 排名与生成的总和指令微调阶段C.3 RankRAG推理:检索-重排-生成 D 实验设计E 个人总结 A 论文出处 论文题目:RankRAG:Unifying Context Ranking…...
【1】跨越技术栈鸿沟:字节跳动开源TRAE AI编程IDE的实战体验
2024年初,人工智能编程工具领域发生了一次静默的变革。当字节跳动宣布退出其TRAE项目(一款融合大型语言模型能力的云端AI编程IDE)时,技术社区曾短暂叹息。然而这一退场并非终点——通过开源社区的接力,TRAE在WayToAGI等…...
7种分类数据编码技术详解:从原理到实战
在数据分析和机器学习领域,分类数据(Categorical Data)的处理是一个基础但至关重要的环节。分类数据指的是由有限数量的离散值组成的数据类型,如性别(男/女)、颜色(红/绿/蓝)或产品类…...
Spring Boot SQL数据库功能详解
Spring Boot自动配置与数据源管理 数据源自动配置机制 当在Spring Boot项目中添加数据库驱动依赖(如org.postgresql:postgresql)后,应用启动时自动配置系统会尝试创建DataSource实现。开发者只需提供基础连接信息: 数据库URL格…...
