力扣刷题——双指针

双指针

数组双指针是一种常用的技巧,用于在数组上进行遍历、搜索或移动元素的操作。它通常使用两个指针来同时遍历数组,分别称为左指针和右指针。

常见的数组双指针操作有以下几种:

1、快慢指针:使用两个指针以不同的速度遍历数组。通常用于解决链表中的问题,如判断是否存在环、查找中间节点等。快指针可以每次前进多步,而慢指针每次只前进一步。

2、左右指针:一个指针从数组的起始位置开始遍历,而另一个指针从数组的末尾位置开始遍历。通常用于解决需要从两个方向同时进行的问题,比如在已排序数组中查找目标元素、判断回文字符串等。

3、对撞指针:即左右指针相向而行,从数组的两端开始遍历。通常用于解决需要收敛到中间的问题,如在有序数组中查找两数之和、判断三数之和等。左指针向右移动,右指针向左移动,直到两个指针相遇或交叉。

这些双指针技巧可以帮助我们在遍历数组时降低时间复杂度,从而提高解决问题的效率。

第283题移动零 moveZeroes ——快慢指针

用到的是快慢指针

class Solution(object):
    def moveZeroes(nums):
        n=len(nums)
        slow = 0
        fast = 0
        while fast<n:
            if nums[fast] != 0:
                nums[slow], nums[fast] = nums[fast], nums[slow]
                slow+=1
            fast +=1
            print (nums)
    #一个测试用例
    nums=[0,1,2,5,0,7,0,0,0,8,0]
    moveZeroes(nums)

用到的是快慢指针。
代码思想解读:
快指针每次增加1,慢指针在快指针是非0元素时才会增加1。
当快指针指向非0时,快慢指针互相交换,然后都增加1,指向下一个元素;
当快指针指向0时,慢指针不动,快指针增加到下一个元素,并与慢指针的元素交换。

这一段有一点绕。详细地,可以只看快指针的指向元素,不用考虑慢指针是否指向0。
这是因为快指针指向0时,慢指针会留在原地,指向这一个0,所以能够保证慢指针及其之前的元素全部都是非零元素。
因为只有当快指针是非0时,慢指针才会往后移动。

if语句的用法

if语句常见的用法是if-else

但是if-break、if-continue等语句也十分实用

下面介绍一下这两类语句的用法。

1、if-break

if-break是指符合if条件后,直接跳出当前循环,不再进行后续的迭代,而继续执行整个循环之后的代码。

当需求是符合某个条件就停止整个循环,可以使用if-break语句。

比如以下代码

for i in range(5):
    if i == 2:
        break
    print(i)

它的输出结果是

0
1

2、if-continue语句

if-continue语句用于跳过当前循环中的剩余代码,进入下一次循环。

如果需求是符合某个条件时,不执行本次循环,可使用if-continue语句。

如以下代码

for i in range(5):
    if i == 2:
        continue
    print(i)

输出结果是

0
1
3
4
5

第11题 盛最多水的容器 ——左右指针

class Solution(object):
    def maxArea(self, height):
        """
        :type height: List[int]
        :rtype: int
        """
        area = 0
        n=len(height)

        if n ==2:
            area = min(height[0],height[1])
     
        left = 0
        right = n - 1
        while left<right:
            if height[left]<height[right]:
                area= max(area , ((right-left) * height[left]))
                left +=1
            else:
                area= max(area,((right-left) * height[right]))
                right -=1
            
        return area

用到了左右指针和while循环

  • 8
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值