刷题学习双指针

最近刷题,浅学了一下双指针,觉得非常有意思
废话不多说来看一下题

第一题:移动零

这是力扣上的题目,可以看到题目要求不复制数组,要在原数组中进行操作
在这里插入图片描述

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]

就可以得到我们要的结果啦
总结:双指针对于我这个初学算法的小菜鸟来说还是比较使用并且难度不高,大家可以多刷两道题就会了!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值