1.基础概念

两个指针有 n*n种组合,因此时间复杂度是 O(n^2) 。而双指针算法就是运用单调性使得指针只能单向移动,因此总的时间复杂度只有 O(2n),也就是O(n)。双指针可以分为两种类型,一种是快慢指针,一种是对撞指针。

2.快慢指针

快慢指针是指定义快指针fast,慢指针slow,两个指针以不同的步长向前移动,直到两个指针的值相等或者满足条件为止。使用快慢指针可以解决如:
(1)leetcode141环形链表是否存在环
(2)剑指offer022链表中环的入口节点
(3)剑指offer022删除链表中的倒数第K个元素

3.对撞指针

对撞指针又叫左右指针,定义左指针left,右指针right,从两端遍历直到两指针相遇或满足条件为止。以下这些题目均使用了对撞指针的思想。
(1)leetcode7.整数反转
(2)leetcode9.回文数
(3)leetcode27.移除元素
(4)leetcode125.验证回文串
(5)leetcode167.两数之II-输入有序数组()
(6)leetcode190.颠倒二进制位()
(7)leetcode344.反转字符串()
(8)leetcode345.反转字符串中的元音字母()
(9)leetcode11.盛水最多的容器(medium)
4.快慢指针举例
leetcode141 环形链表:

具体分析如下图:
代码如下:

# Definition for singly-linked list.
# class ListNode:
# def __init__(self, x):
# self.val = x
# self.next = Noneclass Solution:
def hasCycle(self, head: Optional[ListNode]) -> bool:fast=headslow=headif not head: #链表为空的特殊情况return Falsewhile fast and fast.next: #在没有环的情况下,快指针先走完fast=fast.next.nextslow=slow.nextif fast==slow:return Truereturn False

leetcode142 环形链表2:141题中判断链表是否为环形链表,只需要快慢指针是否相遇。进一步思考,如何判断链表是从哪个节点进入环的?

(1)跟上一题相同,仍然设置fast和slow指针,slow指针第一次进入环并且在遍历完环之前快慢指针一定会相遇,原因如下图:

(2)将链表分成如下图三部分,
第一次相遇时slow走过的路程是s=a+b,
fast走过的路程是f=a+n(b+c)+b, n为快指针比慢指针多走的圈数,f=2s,所以a+n(b+c )+b=2(a+b),化简后a+b=n(b+c)第一次相遇时n=1,所以a=c

(3)代码如下:

# Definition for singly-linked list.
# class ListNode:
# def __init__(self, x):
# self.val = x
# self.next = Noneclass Solution:
def detectCycle(self, head: Optional[ListNode]) -> Optional[ListNode]:slow=head #快慢指针fast=headwhile fast and fast.next:slow=slow.nextfast=fast.next.nextif slow==fast:#相遇时:新指针从链表头部出发,slow沿原路线走a=headwhile a!=slow:a=a.nextslow=slow.nextreturn a #返回a或者slowslow均可return None

5.对撞指针举例
对撞指针leetcode977

该题解法最容易想到的是先对数组每个元素求平方值再进行排序,写法如下:

思路是正确的但是时间复杂度过高,超出题目要求时间。
仔细观察该题目,该数组已经排序,平方后是两边到中间数值逐渐减小,可以使用左右指针比较两侧的数据,能减少时间复杂度。写法如下:

class Solution:def sortedSquares(self, nums: List[int]) -> List[int]:n=len(nums)res=[-1]*n#左右指针从两头开始遍历left=0right=n-1k=n-1#当两指针相遇时停止循环while right>=left:if nums[left]**2>nums[right]**2:res[k]=nums[left]**2left+=1else:res[k]=nums[right]**2right-=1k-=1return res

滑动窗和双指针的概念类似,双指针更注重两个指针的值,而滑动窗口更关注窗口这个区间的值。如leetcode209 长度最小的字符串,给定一个数组和target值,求出和为target的最小连续字数组。

我们很容易就能想到该题目思路:

我们通常使用循环来实现遍历所有元素的目的,那么start和end该怎么参与到循环里?整个程序结束的条件应该是遍历了所有的子数组,end和start都可以循环到数组最后一个元素时实现遍历所有子数组。但是可以看出end能更先到达最后一个值,此时start-end区间的窗口缩小,改变start位置即可实现。具体代码如下:

class Solution:def minSubArrayLen(self, target: int, nums: List[int]) -> int:n=len(nums)start,end=0,0s=0list_len=n+1while end < n:s+=nums[end]while s >= target:list_len=min(list_len,end-start+1)s-=nums[start]start+=1end+=1return 0 if list_len==n+1 else list_len

双指针--快慢指针和对撞指针相关推荐

  1. Leetcode分类练习-查找(2)对撞指针

    对撞指针 leetcode1 Two Sum 题目描述 给出一个整型数组nums,返回这个数组中两个数字的索引值i和j,使得nums[i]+nums[j]等于给定的一个target值,两个索引不能相等 ...

  2. 快慢指针慢指针和快指针一定会相遇

    慢指针每次移动一格,快指针每次移动两格,在有环的链表里,他们一定会相遇 1.当快指针就在慢指针后面,那么下一次慢指针移动一位,快指针移动两位,相遇 2.当快指针和慢指针差一个位置,那么下一次慢指针移动 ...

  3. python 指针_python的指针

    广告关闭 腾讯云11.11云上盛惠 ,精选热门产品助力上云,云服务器首年88元起,买的越多返的越多,最高返5000元! 其中一个ihl特性是指针和引用,它们的行为与您期望的c或c++相似. 例如,您可 ...

  4. C++ 笔记(14)— 指针(指针声明、取地址、取值、new/delete、NULL指针、指针运算、指针数组、数组指针、指针传递给函数、从函数返回指针)

    1. 声明指针 指针是一个变量,其值为另一个变量的地址,即,内存位置的直接地址.就像其他变量或常量一样,您必须在使用指 针存储其他变量地址之前,对其进行声明. 指针变量声明的一般形式为: type * ...

  5. Go 学习笔记(13)— 指针定义、指针特点、空指针、指针数组、指向指针的指针、指针作为函数入参

    1. 复合数据类型 Go 语言基本的复合数据类型有指针.数组.切片.字典.通道.结构和接口等.格式如下: * pointerType // 指针类型, [n]elementType // 数组类型, ...

  6. c++ char数组初始化_c专题指针数组与指针的关联

    ----在今天开始写文章之前,让我不由的想起高中里面学的一篇文章中一段话语,是荀子写的<劝学>:积土成山,风雨兴焉:积水成渊,蛟龙生焉:积善成德,而神明自得,圣心备焉.故不积跬步,无以至千 ...

  7. C指针9:指针数组(即数组中的每个元素都是指针)

    前边已经讲过数组指针,强调的是指针,意思就是该指针指向的是数组(数组里边的元素一般为普通数据). 指针数组,强调的是数组,意思就是该数组里边的每个元素都是指针类型.即如果一个数组中的所有元素保存的都是 ...

  8. C指针6:指针变量作为函数参数

    在C语言中,函数的参数不仅可以是整数.小数.字符等具体的数据,还可以是指向它们的指针.用指针变量作函数参数可以将函数外部的地址传递到函数内部,使得在函数内部可以操作函数外部的数据,并且这些数据不会随着 ...

  9. C语言中“野指针”、“悬空指针”是什么?

    目录 1."野指针"(wild pointer) 2."悬空指针"(dangling pointer) 1."野指针"(wild point ...

最新文章

  1. android 6.0虚拟内存,Maxwell的统一虚拟内存只用在专业卡上,GTX 750 Ti或无缘
  2. 特征选择常用算法综述
  3. 高德地图和百度地图接口封装遇到的问题(一):重复添加实时路况图层后无法移除
  4. cookie 和 session 详解
  5. 利用Asp.Net Core的MiddleWare思想处理复杂业务流程
  6. Collection中list集合的应用常见的方法
  7. 周至四中计算机老师,周至县第四中学顺利承办周至县 “教育信息化技术与教学课堂深度融合交流研讨会”...
  8. linux不写日志,linux 重要日志
  9. mysql表名怎么拼接_自学MySQL第九天
  10. 计算机语言底层用汉语拼音设计,对汉语拼音设计方案认识(10页)-原创力文档...
  11. 微分几何II 曲率
  12. 关于ABAQUS2020二次开发
  13. 微信好友只有昵称没有微信号_只知道昵称怎么查他的微信号
  14. php中seo优化怎么做,SEO技术:对于PHP页面的SEO优化
  15. android 水滴动画效果图,Android控件实现水滴效果
  16. (原创)关于中国象棋的
  17. 软考-信息系统项目管理师-论文
  18. 浅谈网络劫持的原理及影响
  19. 远程视频专家系统,指导系统方案整理
  20. HTML微博浮动代码,jQuery实现仿新浪微博浮动的消息提示框(可智能定位)

热门文章

  1. WITS数据库中国双边进口关税数据环境规制综合指数
  2. 前端IM使用以及视频通讯记录分项
  3. 开展软件下载平台需要办理互联网信息服务许可证ICP吗?
  4. Java基本数据类型初始值(默认值)
  5. 关联对象的实现原理【OC】
  6. 【二分图最大独立集】BZOJ4808[马]题解
  7. php网页右下方广告窗口,javascript实现右下角广告框效果
  8. Linux 监控命令
  9. 通过PPG“神话” 论服装电子商务
  10. springboot+vue汽车租赁系统设计60902