最近刷题,浅学了一下双指针,觉得非常有意思
废话不多说来看一下题
第一题:移动零
这是力扣上的题目,可以看到题目要求不复制数组,要在原数组中进行操作
https://leetcode-cn.com/problems/move-zeroes/
双指针顾名思义,用两个指针进行头尾判断,或者是一前一后的快慢指针,普通循环只能一个一个来,而双指针有两个一起来判断。
这道题呢我是用一前一后的快慢指针来判断,一个指针在固定,另一个指针去搜索,如果为零互换位置,不为零指针往下移动。
思路有了我们来看代码:
class Solution:
def moveZeroes(self, nums: List[int]) -> None:
"""
Do not return anything, modify nums in-place instead.
"""
n = len(nums)
left = right = 0 # 左指针和右指针均指向列表的开头
while right < n:
if nums[right] != 0: # 左指针应当指向为0的元素,如果右指针不为0就将左右指针指向的元素互换
nums[left],nums[right] = nums[right],nums[left]
left += 1
right += 1
第二题:两数之和 II - 输入有序数组
先来看看题目
看到题呢, 我第一想法就是二重循环,但是数有点大,可能会超时,所以还是运用双指针,因为是非递减序列,所以我们先看一头一尾,两数之和与目标值的判断,如果小于,就说明目标值比一头一尾两个数大,那么前指针后移,如果大于,说明目标值小于两指针之和,后指针前移。直到找到目标值!
class Solution:
def twoSum(self, numbers: List[int], target: int) -> List[int]:
i,j= 0,len(numbers)-1
while(numbers[i]+numbers[j]!=target):
if (numbers[i]+numbers[j]<target):
i=i+1
else:
j=j-1
return [i+1,j+1]
就可以得到我们要的结果啦
总结:双指针对于我这个初学算法的小菜鸟来说还是比较使用并且难度不高,大家可以多刷两道题就会了!