常用算法:双指针(对撞指针)

1.两个指针有 n*n种组合,因此时间复杂度是 O(n^2) 。而双指针算法就是运用单调性使得指针只能单向移动,因此总的时间复杂度只有 O(2n),也就是O(n)。
2.双指针可以分为两种类型,一种是快慢指针,一种是对撞指针。
快慢指针是指定义快指针fast,慢指针slow,两个指针以不同的步长向前移动,直到两个指针的值相等或者满足条件为止。使用快慢指针可以解决如:
(1)leetcode141环形链表是否存在环
(2)剑指offer022链表中环的入口节点
(3)剑指offer022删除链表中的倒数第K个元素
对撞指针又叫左右指针,定义左指针left,右指针right,从两端遍历直到两指针相遇或满足条件为止。以下这些题目均使用了对撞指针的思想。
(1)leetcode7.整数反转
(2)leetcode9.回文数
(3)leetcode27.移除元素
(4)leetcode125.验证回文串
(5)leetcode167.两数之II-输入有序数组()
(6)leetcode190.颠倒二进制位()
(7)leetcode344.反转字符串()
(8)leetcode345.反转字符串中的元音字母()
(9)leetcode11.盛水最多的容器(medium)

3.做题实战
对撞指针leetcode977

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

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

双指针:对撞指针
1.两个指针有 n*n种组合,因此时间复杂度是 O(n^2) 。而双指针算法就是运用单调性使得指针只能单向移动,因此总的时间复杂度只有 O(2n),也就是O(n)2.双指针可以分为两种类型,一种是快慢指针,一种是对撞指针。
快慢指针是指定义快指针fast,慢指针slow,两个指针以不同的步长向前移动,直到两个指针的值相等或者满足条件为止。使用快慢指针可以解决如: 
(1)leetcode141环形链表是否存在环
(2)剑指offer022链表中环的入口节点
(3)剑指offer022删除链表中的倒数第K个元素
对撞指针又叫左右指针,定义左指针left,右指针right,从两端遍历直到两指针相遇或满足条件为止。以下这些题目均使用了对撞指针的思想。 
(1)leetcode7.整数反转 
(2)leetcode9.回文数 
(3)leetcode27.移除元素 
(4)leetcode125.验证回文串 
(5)leetcode167.两数之II-输入有序数组() 
(6)leetcode190.颠倒二进制位() 
(7)leetcode344.反转字符串() 
(8)leetcode345.反转字符串中的元音字母() 
(9)leetcode11.盛水最多的容器(medium) 

3.做题实战
对撞指针leetcode977	


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

思路是正确的但是时间复杂度过高,超出题目要求时间。
仔细观察该题目,该数组已经排序,平方后是两边到中间数值逐渐减小,可以使用左右指针比较两侧的数据,能减少时间复杂度。写法如下:
class Solution:
def sortedSquares(self, nums: List[int]) -> List[int]:
n=len(nums)
res=[-1]*n
#左右指针从两头开始遍历
left=0
right=n-1
k=n-1
#当两指针相遇时停止循环
while right>=left:
if nums[left]**2>nums[right]**2:
res[k]=nums[left]**2
left+=1
else:
res[k]=nums[right]**2
right-=1
k-=1
return res


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值