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

算法工具箱之双指针

双指针是算法中一种常用的技巧特别适用于​​数组​​和​​链表​​类问题。它的核心思想是使用两个指针以不同的策略遍历数据结构从而高效地解决问题。双指针常见的三种类型1快慢指针两个指针从同一侧开始移动但移动速度不同。适用范围这种⽅法对于处理环形链表或数组⾮常有⽤。实现方式快慢指针的实现方式有多种但常见的是在⼀次循环中每次让慢的指针向后移动⼀位⽽快的指针往后移动两位实现⼀快⼀慢。下面的例题会解析快慢指针的用法核心思想这个代码中我们会用到两个指针一个fast指针一个slow指针快指针用来遍历整个数组而慢指针用来指向非0的位置遇到非0元素1即可class Solution { public: void moveZeroes(vectorint nums) { int slow -1; int fast 0; for(;fast nums.size();fast) { if(nums[fast]) { swap(nums[slow],nums[fast]); } } } };2左右指针对撞指针两个指针分别指向序列的​​开头左和结尾右​​然后向中间移动直到它们相遇。特点​​指针移动方向是​​相对的​​。适用范围主要适用于​​数组​​和​​字符串​​通常要求序列是​​有序的​​。来一道例题来解析对撞指针的用法class Solution { public: int maxArea(vectorint height) { int left 0; int right height.size() - 1; int ret 0; while(left right) { int high min(height[right],height[left]); int width right - left; int nowret high * width; ret max(ret,nowret); if(height[right] height[left]) { left; } else { right--; } } return ret; } };这道题让我们求承最多水的容器也就是求面积最大的区域所以这道题我们应该找出面积最大的区域。我们可以先定义出一个left和一个right用来表示height数组中的最左侧位置和最右侧位置然后我们通过min来比较谁的高度比较小并且与距离相乘用来求出当前区域的面积。然后与最大的面积相比留下最大的面积随后我们比较right和left所对应的数组元素的高度较小的一方缩进数组随后再重复以上方法进而比较出面积最大的区域。为什么要移去较小边界的那一端呢因为当我们移动较高边界那一端时最低的高度不变反而宽度减小这样并不会生成面积更大的数组反而当我们把数组较小的那一端移去虽然宽度减小但是有可能高度会增加进而产生的面积可能比原来的最大面积更大。3滑动窗口滑动窗口是双指针的一种高级用法两个指针形成一个窗口区间通过移动左右指针来动态地维护这个窗口从而解决问题。适用场景寻找满足某种条件的连续子数组或子字符串如最小覆盖子串、长度最小的子数组、无重复字符的最长子串。。核心思想1.right指针向右扩张窗口直到窗口内的元素满足条件。2.然后left指针向右收缩窗口同时更新最优解直到窗口不再满足条件。3.重复步骤 1 和 2直到right到达末尾。例题class Solution { public: int minSubArrayLen(int target, vectorint nums) { int left 0; int right 0; int sum 0; int min_len INT_MAX; for(;right nums.size();right) { sum nums[right]; while(sum target) { min_len min(min_len,right - left 1); sum - nums[left]; left; } } return (min_len INT_MAX ? 0 : min_len); } };我们定义两个指针left和right初始都指向数组的起始位置。再定义出定义sum记录当前窗口的和min_len记录最小长度。随后将nums[right]加到sum中表示扩展窗口的右边界。right向右移动直到sum target。当sum target时尝试收缩窗口的左边界计算当前窗口的长度right - left 1并更新min_len。将nums[left]从sum中减去然后left右移。重复此过程直到sum target窗口不再满足条件。当right遍历完整个数组后返回min_len。如果min_len未被更新即没有满足条件的子数组返回0。为什么滑动窗口有效并且时间复杂度更低呢因为这个数组都是正整数这意味着我们向右扩展窗口时数组内元素之和是严格递增的当我们向右收缩窗口时数组内元素之和也是严格递减的。不会出现反复回溯的情况。通过left和right两个指针滑动窗口可以不遗漏任何可能的连续的子数组。避免了暴力解法中的重复计算。通过每次发现sum target,记录当前窗口的长度并且进行比较一旦sum target就停止收缩直接扩展窗口避免无效计算。时间复杂度虽然代码是两层循环但是我们的 left 指针和 最多都往后移动 n 次。因此时间复杂度是 O(N) 。

相关文章:

算法工具箱之双指针

双指针是算法中一种常用的技巧,特别适用于​​数组​​和​​链表​​类问题。它的核心思想是使用两个指针以不同的策略遍历数据结构,从而高效地解决问题。双指针常见的三种类型:(1)快慢指针:两个指针从同一…...

千问3.5-2B轻量部署最佳实践:Docker容器资源限制+GPU显存预分配配置

千问3.5-2B轻量部署最佳实践:Docker容器资源限制GPU显存预分配配置 1. 千问3.5-2B模型简介 千问3.5-2B是Qwen系列中的轻量级视觉语言模型,具备图片理解与文本生成能力。这个2B参数规模的模型在保持较高性能的同时,显著降低了部署门槛和资源…...

【声音克隆】Qwen3-TTS-12Hz-1.7B-Base零基础部署教程:5分钟搞定10国语言语音合成

Qwen3-TTS-12Hz-1.7B-Base零基础部署教程:5分钟搞定10国语言语音合成 声音克隆技术迎来重大突破!Qwen3-TTS-12Hz-1.7B-Base作为新一代语音合成模型,支持中文、英文、日文等10种主要语言和多种方言风格。本文将带你从零开始,只需5…...

HWA05_leetcode48旋转图像

题目解法class Solution:def rotate(self, matrix: List[List[int]]) -> None:"""Do not return anything, modify matrix in-place instead."""#这是一个n行n列的矩阵n len(matrix)#只需要遍历n/2行for i in range(n//2):#每一列从i开始直到…...

ollama部署embeddinggemma-300m:面向初创团队的低成本AI基建方案

ollama部署embeddinggemma-300m:面向初创团队的低成本AI基建方案 对于很多初创团队来说,AI能力听起来很美好,但落地起来却困难重重。动辄需要云端GPU、复杂的部署流程和昂贵的API调用费用,让不少团队望而却步。有没有一种方案&am…...

HWA_04 LeetCode 150、逆波兰表达式求值

题目解题思路 class Solution:def evalRPN(self, tokens: List[str]) -> int:stack []for token in tokens:try:stack.append(int(token))except:num2stack.pop()num1stack.pop()stack.append(self.evluate(num1,num2,token))return stack[0]def evluate(self,num1,num2,op)…...

HWA_03 leetcode874模拟行走机器人

题目map方法的作用解题思路 class Solution:def robotSim(self, commands: List[int], obstacles: List[List[int]]) -> int:#初始化结果result 0#从原点0,0位置开始出发x0y0#机器人前进的方向#初始方向:正北#0表示向北#1表示向东#2表示向南#3表示向西direction0…...

Bootbox.js终极指南:如何用可复用对话框提升开发效率

Bootbox.js终极指南:如何用可复用对话框提升开发效率 【免费下载链接】bootbox Wrappers for JavaScript alert(), confirm() and other flexible dialogs using Twitters bootstrap framework 项目地址: https://gitcode.com/gh_mirrors/bo/bootbox Bootbox…...

OpenSC2K终极问题解决指南:20个典型开发和使用问题及快速解决方案

OpenSC2K终极问题解决指南:20个典型开发和使用问题及快速解决方案 【免费下载链接】OpenSC2K OpenSC2K - An Open Source remake of Sim City 2000 by Maxis 项目地址: https://gitcode.com/gh_mirrors/op/OpenSC2K OpenSC2K是一款基于JavaScript和WebGL Can…...

如何用Python脚本实现剪映自动化:JianYingApi技术深度解析

如何用Python脚本实现剪映自动化:JianYingApi技术深度解析 【免费下载链接】JianYingApi Third Party JianYing Api. 第三方剪映Api 项目地址: https://gitcode.com/gh_mirrors/ji/JianYingApi 面对视频剪辑中的重复性劳动,你是否渴望解放双手&am…...

goqu性能优化实战:10个提升查询效率的关键技巧

goqu性能优化实战:10个提升查询效率的关键技巧 【免费下载链接】goqu SQL builder and query library for golang 项目地址: https://gitcode.com/gh_mirrors/go/goqu goqu是一款强大的Golang SQL构建和查询库,能够帮助开发者高效地构建和执行SQL…...

OpenSC2K完整开发路线图:打造终极开源城市模拟体验的三大核心方向

OpenSC2K完整开发路线图:打造终极开源城市模拟体验的三大核心方向 【免费下载链接】OpenSC2K OpenSC2K - An Open Source remake of Sim City 2000 by Maxis 项目地址: https://gitcode.com/gh_mirrors/op/OpenSC2K OpenSC2K是一款基于经典游戏《模拟城市200…...

3步突破资源提取瓶颈:让Wallpaper Engine效率提升300%的终极方案

3步突破资源提取瓶颈:让Wallpaper Engine效率提升300%的终极方案 【免费下载链接】repkg Wallpaper engine PKG extractor/TEX to image converter 项目地址: https://gitcode.com/gh_mirrors/re/repkg 在Wallpaper Engine资源开发领域,创作者和开…...

AIGlasses_for_navigation 模型部署的常见错误403 Forbidden排查与解决

AIGlasses_for_navigation 模型部署的常见错误403 Forbidden排查与解决 最近在星图平台上部署了AIGlasses_for_navigation模型,想通过Web API调用一下,结果一发送请求,直接给我返回了个“403 Forbidden”。相信不少朋友在调用自己部署的服务…...

Architect.dev核心组件架构揭秘:深入理解@http、@tables、@events

Architect.dev核心组件架构揭秘:深入理解http、tables、events 【免费下载链接】architect The simplest, most powerful way to build a functional web app (fwa) 项目地址: https://gitcode.com/gh_mirrors/ar/architect Architect.dev 是一个革命性的无服…...

Win10下VSCode安装全攻略:用户版vs系统版到底选哪个?

Win10下VSCode安装全攻略:用户版vs系统版深度解析与实战指南 Visual Studio Code(简称VSCode)作为微软推出的轻量级代码编辑器,凭借其强大的扩展性和跨平台特性,已成为开发者日常工作的标配工具。但在Windows 10环境下…...

用Python和Java复刻经典:Dijkstra最短路径算法从邻接矩阵到完整代码实现

Python与Java双视角解析:Dijkstra最短路径算法的工程实践 当我们需要在电子地图中规划最优路线,或在网络拓扑中寻找最低延迟路径时,图论中的最短路径算法就成为了核心技术支撑。Dijkstra算法作为其中最经典的解决方案之一,其思想简…...

OpenClaw多模态探索:千问3.5-9B处理图文混合任务

OpenClaw多模态探索:千问3.5-9B处理图文混合任务 1. 为什么需要多模态自动化助手 上周我在整理技术文档时遇到一个典型问题:需要根据包含屏幕截图和文字描述的故障报告,编写对应的排查步骤。手动在截图和文本之间来回切换,既低效…...

ChatTTS语音导航优化:车载系统更人性化播报

ChatTTS语音导航优化:车载系统更人性化播报 1. 引言:让车载导航真正"会说话" 你有没有遇到过这样的情况:开车时听着机械冰冷的导航语音,感觉像是在听机器人念经?"前方300米右转"、"请保持直…...

加密货币数据标准化:Cryptofeed如何统一50+交易所的数据格式

加密货币数据标准化:Cryptofeed如何统一50交易所的数据格式 【免费下载链接】cryptofeed Cryptocurrency Exchange Websocket Data Feed Handler 项目地址: https://gitcode.com/gh_mirrors/cr/cryptofeed 在加密货币交易的世界中,数据标准化是一…...

3个步骤实现BetterGenshinImpact多账号协同管理:高效掌控多角色游戏体验

3个步骤实现BetterGenshinImpact多账号协同管理:高效掌控多角色游戏体验 【免费下载链接】better-genshin-impact 📦BetterGI 更好的原神 - 自动拾取 | 自动剧情 | 全自动钓鱼(AI) | 全自动七圣召唤 | 自动伐木 | 自动刷本 | 自动采集/挖矿/锄地 | 一条…...

Hypersistence Utils数组类型深度解析:PostgreSQL ARRAY到Java List的完美映射

Hypersistence Utils数组类型深度解析:PostgreSQL ARRAY到Java List的完美映射 【免费下载链接】hypersistence-utils The Hypersistence Utils library (previously known as Hibernate Types) gives you Spring and Hibernate utilities that can help you get th…...

EdgeConnect三阶段训练详解:从边缘生成到联合优化

EdgeConnect三阶段训练详解:从边缘生成到联合优化 【免费下载链接】edge-connect EdgeConnect: Structure Guided Image Inpainting using Edge Prediction, ICCV 2019 https://arxiv.org/abs/1901.00212 项目地址: https://gitcode.com/gh_mirrors/ed/edge-conn…...

Harpy与Swift项目集成:从Objective-C到现代开发的平滑过渡终极指南

Harpy与Swift项目集成:从Objective-C到现代开发的平滑过渡终极指南 【免费下载链接】Harpy Notify users when a new version of your app is available and prompt them to upgrade. 项目地址: https://gitcode.com/gh_mirrors/ha/Harpy 在iOS应用开发中&am…...

使用Dify快速搭建SmolVLA应用:可视化工作流与Agent编排

使用Dify快速搭建SmolVLA应用:可视化工作流与Agent编排 你是不是也遇到过这样的场景:手里有一个很酷的多模态大模型,比如能看懂图片又能聊天的SmolVLA,但不知道怎么把它变成一个能实际用起来的应用?自己写代码吧&…...

NBIO与标准net/http对比:10倍性能提升的秘密

NBIO与标准net/http对比:10倍性能提升的秘密 【免费下载链接】nbio Pure Go 1000k connections solution, support tls/http1.x/websocket and basically compatible with net/http, with high-performance and low memory cost, non-blocking, event-driven, easy-…...

Notepad++ 插件构想:集成Phi-4-mini-reasoning实现轻量级代码智能

Notepad 插件构想:集成Phi-4-mini-reasoning实现轻量级代码智能 1. 为什么Notepad需要AI插件 作为一个经典的轻量级文本编辑器,Notepad凭借其简洁高效的特点赢得了全球开发者的喜爱。但随着AI技术的快速发展,传统编辑器在代码智能辅助方面的…...

从MySQL DBA视角迁移:在Ubuntu 22.04上快速上手人大金仓KingbaseES的配置与连接

从MySQL DBA视角迁移:在Ubuntu 22.04上快速上手人大金仓KingbaseES的配置与连接 对于长期使用MySQL或Oracle的数据库管理员来说,初次接触国产数据库KingbaseES可能会感到既熟悉又陌生。作为一款成熟的企业级关系型数据库,KingbaseES在语法和功…...

避坑指南:RK3588 HDMI输出分辨率不生效?除了改驱动,你还需要检查这几点

RK3588 HDMI输出分辨率调试实战:从代码修改到系统级排查 最近在调试RK3588平台的HDMI输出时,发现一个有趣的现象:明明按照官方文档和社区教程修改了内核驱动代码,添加了3840x216030Hz的分辨率支持,但系统设置里就是找不…...

千问3.5-2B实战:利用Typora与AI打造智能笔记系统

千问3.5-2B实战:利用Typora与AI打造智能笔记系统 1. 智能笔记系统的价值与痛点 在日常学习和工作中,我们经常面临这样的困境:收集了大量笔记资料,却难以有效组织和利用;记录了许多灵感想法,却无法快速转化…...