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