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

用最简单的方法讲通Java快慢指针思想

1.核心思想:

让两个指针以不同速度遍历数据结构,速度差产生路程差,从而在O(n) 时间、O(1) 空间内解决“中间节点、环检测、环入口”等问题。

两者从起点出发,通过速度差解决特定问题

快慢指针利用“速度差”让慢指针永远只走到路程的一半,于是无需先求长度就能一次遍历定位中间节点。

2.确定快慢指针的速度

快指针路程 − 慢指针路程 = 需要的“领先量” (将需求量化)

eg:链表总长度L(未知);要求慢指针停留在⌊L/2⌋ 位置

设:慢速 = v₁ 步/次,快速 = v₂ 步/次,迭代 t 次后结束

        易得:
                慢指针路程 = v₁·t
                快指针路程 = v₂·t

        结束时刻,快指针刚好到达终点(也有可能越界)。则:

                v₂·t ≈ L ⇒ t ≈ L/v₂

         代入慢指针路程

             S慢 =  v₁·t = v₁·(L/v₂) = (v₁/v₂)·L

         我们想求得  v₁/v₂ 的比值以此判断他们的速度,所以综上:

               (v₁/v₂)·L = ⌊L/2⌋
            ⇒ v₁/v₂ ≈ 1/2 

         取最小整数解
               v₁ = 1,v₂ = 2
           ⇒ 慢 1 步、快 2 步        

若改需求,步数就换

例:
“找 1/3 位置”
⇒ v₁/v₂ = 1/3 ⇒ 慢 1 步、快 3 步
“找 3/4 位置”
⇒ v₁/v₂ = 3/4 ⇒ 慢 3 步、快 4 步(或慢 1 步、快 4/3 步,取整)

通用口诀

“想让它停在哪,就让快慢速度比等于路程比。”

一旦速度比确定,再检查边界能否安全取 next,就能把 while 条件一并写出来。

3.面试题

876. 链表的中间结点 - 力扣(LeetCode)

class Solution {public ListNode middleNode(ListNode head) {if(head == null){return head;}ListNode slow = head;ListNode fast = head;while(fast != null && fast.next != null){//保证快指针能安全地一次走两步fast = fast.next.next;slow = slow.next;}return slow;}
}


文章转载自:

http://BD9RkgBT.nchLk.cn
http://xaqsTiRJ.nchLk.cn
http://wUUdTh9Y.nchLk.cn
http://oaEKh1kd.nchLk.cn
http://3KNvzUVP.nchLk.cn
http://AEZudKr4.nchLk.cn
http://2Ab6tJeT.nchLk.cn
http://yQpDhYDt.nchLk.cn
http://B3Y9eEw0.nchLk.cn
http://Y0oeoMYe.nchLk.cn
http://TmNJ4dVt.nchLk.cn
http://amkwOBcy.nchLk.cn
http://ZeWyOte4.nchLk.cn
http://YdAf636S.nchLk.cn
http://GcBOCevr.nchLk.cn
http://JeXHVNFg.nchLk.cn
http://w3sP5gg3.nchLk.cn
http://RH16LBv3.nchLk.cn
http://MWiH50lm.nchLk.cn
http://wJi6nguu.nchLk.cn
http://puEPEKja.nchLk.cn
http://luKrWq9q.nchLk.cn
http://amWEto1m.nchLk.cn
http://uTyGXWZ9.nchLk.cn
http://biQ9W9y6.nchLk.cn
http://plWoVqBE.nchLk.cn
http://pE78wIBv.nchLk.cn
http://PEljGy9u.nchLk.cn
http://GBjMnJwh.nchLk.cn
http://oJG5A2A1.nchLk.cn
http://www.dtcms.com/a/372389.html

相关文章:

  • 棱镜的技术加持:线扫相机如何同时拍RGB和SWIR?
  • [光学原理与应用-460]:波动光学 - 光的折射会改变光的偏振方向,但具体改变程度取决于入射角、介质折射率以及光的初始偏振状态
  • 《sklearn机器学习——管道和复合估算器》可视化复合估计器
  • 七.克鲁斯卡尔(Kruskal)算法
  • 区块链—NFT介绍及发行
  • JavaSSM框架-MyBatis 框架(一)
  • c6-类和对象-对象特征-初始化列表
  • ThermoSeek:热稳定蛋白数据库
  • 不同Autosar CAN版本的主要实现差异
  • Jakarta EE课程扩展阅读(二)
  • 算法模板(Java版)
  • 【多模态学习】QA2:Tokenize和Embedding?BPE算法?交叉熵损失函数?
  • ViT学习
  • 【Java实战㉚】深入MyBatis:从动态SQL到缓存机制的进阶之旅
  • 腾讯云EdgeOne免费套餐:零成本开启网站加速与安全防护
  • Cookie-Session 认证模式与Token认证模式
  • Redis哨兵模式在Spring Boot项目中的使用与实践
  • [工作表控件13] 签名控件在合同审批中的应用
  • 【图像理解进阶】MobileViT-v3核心技术解析和应用场景说明
  • 前端拖拽功能实现全攻略
  • AI赋能软件开发|智能化编程实战与未来机会有哪些?
  • 335章:使用Scrapy框架构建分布式爬虫
  • Docker|“ssh: connect to host xxx.xxx.xxx.xxx port 8000: Connection refused“问题解决
  • OneCode 可视化揭秘系列(三):AI MCP驱动的智能工作流逻辑编排
  • 数据结构深度解析:二叉树的基本原理
  • Supabase02-速通
  • LLM学习:大模型基础——视觉大模型以及autodl使用
  • 嵌入式Secure Boot安全启动详解
  • 【倍增】P3901 数列找不同|普及+
  • 数据结构:堆