2024年最全双指针法总结之倚天屠龙_双指针算法总结(2),快速上手

img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上C C++开发知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以戳这里获取

引言
假期在看这块知识时,突然想到双指针中的”快慢指针“就像是倚天剑,一前一后单向执行(就像倚天剑被灭绝师太和周芷若依次拿到那样),就是为了测试链表环的问题(为了测试武当七子连环阵的环是否有问题);而”左右指针“就像屠龙刀,在使用时有一些前提:金毛狮王谢逊拿着时(数组有序啥的),然后用来进行二分搜索,加上递归解决Nsum问题,威猛无比
类比学习法而已,唯博君一笑耳!

双指针技巧分类:

双指针技巧分为两类:

  • 一类是“快慢指针(倚天剑)”,主要解决链表中的问题,比如典型的判定链表中是否包含环;
  • 一类是“左右指针(屠龙刀)”,主要解决数组/字符串中的问题,比如二分搜索。
一、快慢指针法-倚天剑

快慢指针一般会初始化指向链表的头结点head,前进时快指针fast在前,慢指针slow在后,巧妙解决一些链表中的问题。

  1. 判断链表中是否有环

经典解法双指针,一个跑得快,一个跑得慢。如果不含有环,跑的快的那个指针最终会遇到null,说明链表不含环;如果含有环,快指针最后会超慢指针1圈,和慢指针相遇,说明链表含有环。
2. 已知链表中含有环,返回这个环的起始位置

解法:当快慢指针相遇时,让其中任何一个指针指向头结点,然后两个指针以相同速度前进,再次相遇时所在的节点位置就是环开始的位置。

原因:假设第一次相遇时,假设慢指针slow走了k步,那么快指针走了2k步,得到快指针多了了一圈为k步。设相遇点与环的起点距离为m,那么环的起点与头节点head的距离为k-m,也就是说从head前进k-m步就能到达环起点。巧合的是,如果从相遇点继续前进k-m布,也恰好到达环起点。
3. 寻找无环单链表的重点
笨方法:先指针遍历一遍,记录中节点个数为n,然后从头再来走n/2步
优雅解法:快指针一次走两步,慢指针一次走一步,当快指针到链表尽头时,慢指针就处于链表的中间位置。

应用:寻找链表中点的一个重要作用就是对链表进行归并排序。对两部分链表分别排序,然后合并为有序数组。
4. 寻找单链表的倒数第k个元素

还是快慢指针,让快指针先走k步,然后快慢指针同时前进。快指针到链表尽头时,慢指针所在位置就是倒数第k个链表节点

二、左右指针法-屠龙刀

基本用法:一般初始化为left=0,right=len(num)-1

  1. 二分搜索

左右指针在数组两端初始化,左指针往右走,右指针往做走,直至找到目标值
2. 两数之和

数组有序时,就应该想到双指针技巧。类似二分搜索,通过sum大小调节left和right的移动,直至找到目标对
3. 翻转数组

左右指针在数组两端初始化,相向而行,同时交互对应的元素
4. 滑动窗口算法
双指针技巧的最高境界。快慢指针在数组/字符串上的应用。如果掌握了该算法,既可以解决一大类字符串匹配问题

三、左右指针法高级用法之-二分搜索算法(屠龙刀威力之一)

场景:给定一个数寻找左侧边界、寻找右侧边界

技巧:

​ 1)不要出现else,而是把所有情况用else if写清楚,这样可以清晰展现所有细节;

​ 2)计算mid时要防止溢出,推荐使用left + (right-left)/2,而不是(left + right)/2

  1. 寻找一个数(基本二分搜索)

数组排序为有序,左右指针根据大小判断左右指针依次相向而行,找到目标值

差异梳理:因为我们初始化right = num.length-1,决定了我们搜索区间是[left,right]

所以决定了while(left <= right),同时也决定了left=mid+1right=mid-1

因此我们只需要找到一个target的索引即可,所以当nums[mid] == target时可以立即返回
2. 寻找左侧边界的二分搜索

[1,2,2,2,3]返回下标1

差异梳理:因为我们初始化right = num.length,决定了我们搜索区间是[left,right)

img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上C C++开发知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以戳这里获取

包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新**

如果你需要这些资料,可以戳这里获取

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值