双指针
数组双指针是一种常用的技巧,用于在数组上进行遍历、搜索或移动元素的操作。它通常使用两个指针来同时遍历数组,分别称为左指针和右指针。
常见的数组双指针操作有以下几种:
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循环