数组算法-双指针

首先,双指针法,本质是通过两个索引(指针)在数组上移动,用一次遍历(O (n) 时间复杂度)替代嵌套循环(O (n²)),核心是用空间换时间(仅额外使用两个变量,空间复杂度 O (1))。

指针的移动规则根据问题场景而定,但核心都是:通过指针的协作,缩小处理范围,避免重复计算


1.左右指针(左 = 0,右 = len-1,向中间相遇)

1.适用:数组有序或 问题具有对称性,无需遍历所有元素,通过两端收缩即可找到解。

  • 数组 / 字符串的对称操作:反转数组、反转字符串、判断回文数 / 回文字符串

  • 有序数组的两数之和:找两个数和为目标值(LeetCode LCR 006,167)

  • 有序数组的区间收缩:最接近目标值的两数之和、两数之差等于目标值

2.循环条件:left < right(无需<=,相遇即终止)

3.移动规则:根据条件单向移动(左指针右移增大值,右指针左移减小值)

例 1:

我们分析题目信息发现“数组有序”“要找两数之和为目标数”,那么就可以使用左右指针解答:

intleft=0,right=numbers.length-1;while(left<right){if(numbers[left]+numbers[right]>target){right--;}elseif(numbers[left]+numbers[right]<target){left++;}else{break;}}returnnewint[]{left,right};

最后我们还要注意边界校验,此题告诉我们一定存在结果,追求简洁可不加;但通常我们还要加上:

if (numbers == null || numbers.length < 2) return new int[]{-1, -1};表示无结果

2.快慢指针(慢指针定有效边界,快指针遍历全数组,同向移动)

1.适用:需要原地修改数组,需筛选 / 保留有效元素,剔除无效元素(重复、指定值、0 值等)。

  • 有序数组去重(LeetCode 26)
  • 移除数组中指定值的元素(LeetCode 27)
  • 移动数组中的 0 到末尾(保留非 0 元素的相对顺序)
  • 筛选数组中的有效元素(如只保留偶数、只保留正数)

2.循环条件:fast < nums.length(快指针遍历完数组即终止)

3.移动规则:快指针找到有效元素时,慢指针先右移(扩大有效区域)再赋值覆盖,否则快指针单独右移

4.结果返回:slow + 1(慢指针是索引,有效数组长度 = 索引 + 1)

例 2:

我们看题干中出现”非严格递增排列“,”原地删除“和”只出现一次“的字样,确定此题属于有序数组去重,可以使用快慢指针解题:

intslow=0;for(intfast=1;fast<nums.length;fast++){if(nums[slow]!=nums[fast]){slow++;nums[slow]=nums[fast];}}returnslow+1;

例 3:

先分析题干“原地”,“移除指定值”,可以使用快慢指针解题:

intslow=0;for(intfast=0;fast<nums.length;fast++){if(nums[fast]!=val){nums[slow]=nums[fast];slow++;}}returnslow;

3. 滑动窗口(动态快慢指针,形成可变窗口,同向移动)

1.适用:子串的最值(最长 / 最短)、满足条件的子数组(和≥目标值、和为 k、无重复元素),问题聚焦连续区间的筛选

  • 长度最小的子数组(和≥目标值,LeetCode209)
  • 最长无重复元素的子数组
  • 固定长度子数组的最大和 / 最小和
  • 子数组的和等于 k 的最短长度

2.循环条件:fast < nums.length(右指针遍历完数组即终止)

3.左指针:窗口左边界(控制窗口收缩)

4.右指针:窗口右边界(控制窗口扩大)

5.核心逻辑:右指针扩大窗口找解,左指针收缩窗口优化解

例 4:

求子数组,这是一个带条件(sum>=target) 的连续区间,即可以使用滑动窗口解题:

if(nums.length==0||nums==null)return0;intsum=0;intminLen=Integer.MAX_VALUE;intleft=0;for(intright=0;right<nums.length;right++){sum+=nums[right];while(sum>=target){minLen=Math.min(minLen,right-left+1);sum-=nums[left];left++;}}returnminLen==Integer.MAX_VALUE?0:minLen;
  1. 思路:第一步数组求和,第二步要求和值大于等于target的情况下缩短有效窗口的长度使其长度最小
  2. 我们照常声明左右指针都为0,通过右指针扩大右边界来遍历数组求和sum
  3. sum >= target时,就可以通过左指针循环收缩左边界,直到不满足条件
  4. 同时每次达到条件都可以将此时的长度赋值给minLen并保持最小
    缩短有效窗口的长度使其长度最小
  5. 最后考虑特殊情况,如果在右指针遍历的全过程中没有一次满足条件,则minLen == Integer.MAX_VALUE,即不存在符合条件的子数组返回 0

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

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

相关文章

最新谷歌商店安装教程(保姆级),谷歌三件套问题汇总!闪退,无法登录等各手机解决方案

一定要看清楚&#xff0c;很多大佬最后失败就是没掌握方法。 重要提醒 这里给大家汇总谷歌三件套的版本合集&#xff0c;应该是目前最全面的谷歌三件套版本汇总了。 在安装的时候一定要试一下不同版本的谷歌服务框架&#xff01; 在安装的时候一定要试一下不同版本的谷歌服务…

基于Python + Django物业管理系统(源码+数据库+文档)

物业管理 目录 基于PythonDjango物业管理系统 一、前言 二、系统功能演示 三、技术选型 四、其他项目参考 五、代码参考 六、测试参考 七、最新计算机毕设选题推荐 八、源码获取&#xff1a; 基于PythonDjango物业管理系统 一、前言 博主介绍&#xff1a;✌️大厂码农…

基于Python 个性化餐饮管理系统(源码+数据库+文档)

个性化餐饮管理 目录 基于PythonDjango个性化餐饮管理系统 一、前言 二、系统功能演示 三、技术选型 四、其他项目参考 五、代码参考 六、测试参考 七、最新计算机毕设选题推荐 八、源码获取&#xff1a; 基于PythonDjango个性化餐饮管理系统 一、前言 博主介绍&…

智慧交通数据治理中的典型“四重困境”:**异构性、时效性、关联性、质量性**四大瓶颈,共同导致数据价值难以释放

智慧交通数据治理中的典型“四重困境”&#xff1a;异构性、时效性、关联性、质量性四大瓶颈&#xff0c;共同导致数据价值难以释放。要系统性破局&#xff0c;需构建“一底座、两引擎、三闭环”的新型交通数据智能中枢架构&#xff1a; 一底座&#xff1a;建设统一时空基准的数…

驾校管理|基于springboot + vue驾校管理系统(源码+数据库+文档)

驾校管理 目录 基于springboot vue驾校管理系统 一、前言 二、系统功能演示 三、技术选型 四、其他项目参考 五、代码参考 六、测试参考 七、最新计算机毕设选题推荐 八、源码获取&#xff1a; 基于springboot vue驾校管理系统 一、前言 博主介绍&#xff1a;✌️大…

要落实国家“人工智能+”行动与“数据要素×”三年行动计划并打造数智化发展新高地

要落实国家“人工智能”行动与“数据要素”三年行动计划并打造数智化发展新高地&#xff0c;可从以下方面入手&#xff1a; 在“人工智能”行动方面&#xff0c;首先&#xff0c;结合本地产业特色&#xff0c;推动人工智能与传统产业深度融合。例如在制造业领域&#xff0c;引入…

通过华为账号识别用户风险,降低业务损失

当应用平台组织诸如秒杀、抽奖等营销活动时,经常会遭遇"薅羊毛"行为,给业务方带来不小的经费损失。比如通过虚假手机号进行批量注册,多次参加活动;又比如,当应用商户进行红包补贴、优惠券发放等营销活动…

基于Python 图书管理系统(源码+数据库+文档)

图书管理 目录 基于PythonDjango图书管理系统 一、前言 二、系统功能演示 三、技术选型 四、其他项目参考 五、代码参考 六、测试参考 七、最新计算机毕设选题推荐 八、源码获取&#xff1a; 基于PythonDjango图书管理系统 一、前言 博主介绍&#xff1a;✌️大厂码农…

【大数据毕设全套源码+文档】基于Django+协同过滤算法的电影个性化推荐系统的设计与实现(丰富项目+远程调试+讲解+定制)

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

数据作为新型生产要素,正深刻推动各产业数字化转型与智能化升级

数据作为新型生产要素&#xff0c;正深刻推动各产业数字化转型与智能化升级。高质量数据集是实现数据价值释放的关键基础&#xff0c;能够有效支撑人工智能模型训练、算法优化和场景化应用落地。此次面向能源、生物医药、金融、交通、低空、教育等重点领域的首批高质量数据集“…

揭秘气相毛细柱行业十大品牌:生产厂家综合实力排行榜

在精密分析仪器领域,一根直径不足1毫米的毛细柱,却承载着环境监测的生命线、制药安全的守护神、食品安全的第一道防线。2026年,全球气相色谱柱市场正经历国产突围与国际巨头深度博弈的关键期,一份基于市场份额、技…

快速验证:用中文Cursor一小时打造天气APP

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容&#xff1a; 开发一个基于Python的天气查询应用原型&#xff0c;要求&#xff1a;1. 全程使用中文版Cursor 2. 展示AI生成代码过程 3. 包含API调用和UI设计 4. 可一键运行的完整项目。使用Flas…

2026成都装修公司哪家好?实测口碑装修公司+选装攻略,新手装修省心装

2026成都装修公司哪家好?实测口碑装修公司+选装攻略,新手装修省心装一、引言:成都装修市场选择多样,选对公司更省心 在成都这个充满活力与机遇的城市,装修市场正蓬勃发展。无论是旧房翻新,还是新房装修,人们对居…

RAG性能瓶颈突破:文档切分的核心逻辑与最优实践

引言在检索增强生成&#xff08;RAG&#xff09;系统中&#xff0c;有一个看似基础却能决定系统成败的关键环节——文档切分。很多开发者搭建的RAG系统&#xff0c;检索结果不准确、生成内容驴唇不对马嘴&#xff0c;究其原因&#xff0c;往往是文档切分做得不到位。想象一下&a…

【大数据毕设全套源码+文档】基于Djangod+协同过滤算法的经济型酒店推荐系统大数据的设计与实现(丰富项目+远程调试+讲解+定制)

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

MySQL LIMIT在电商系统中的5个实战应用

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容&#xff1a; 开发一个电商数据查询演示系统&#xff0c;展示LIMIT在不同场景下的应用。包括&#xff1a;1)商品列表分页查询 2)每日热销Top10 3)新用户随机推荐5件商品 4)库存预警前20条 5)用户…

我把pdfplumber整成了可以拖拉拽的web应用

pdfplumber是专门用来处理PDF的第三方库&#xff0c;完全开源和免费&#xff0c;它最核心的功能是提取PDF的文本和表格&#xff0c;支持保留段落、换行、空格的原始格式&#xff0c;不会像某些库那样把不同区域的文本混在一起&#xff0c;是我体验下来最好用的PDF处理库。pdfpl…

2026五大成都优质装修机构盘点

2026五大成都优质装修机构盘点一、成都装修市场现状剖析 随着成都城市建设的飞速发展以及人们生活水平的显著提高,装修行业在成都呈现出蓬勃发展的态势。大街小巷随处可见装修公司的招牌,各类装修相关信息丰富多样,…

双击轻捏,手写笔交互丝滑切换

在移动办公与数字创作日益普及的今天,手写笔已成为提升平板、手机等设备生产力的关键工具。然而,传统手写场景中,用户常因操作复杂(如频繁切换工具)、跨设备体验割裂等问题导致效率低下,而开发者则面临手势识别算…

基于Python + Django个性化餐饮管理系统(源码+数据库+文档)

个性化餐饮管理 目录 基于PythonDjango个性化餐饮管理系统 一、前言 二、系统功能演示 三、技术选型 四、其他项目参考 五、代码参考 六、测试参考 七、最新计算机毕设选题推荐 八、源码获取&#xff1a; 基于PythonDjango个性化餐饮管理系统 一、前言 博主介绍&…