双指针之碰撞指针
也就是两个指针,分别指向头和尾,向中间靠拢 直到碰到一起,程序终止,移动过程中按照一定的规则进行移动;
python中一般用List或字符串做数据
比如以下程序(来源Github,地址最下)用来解决:(Leetcode 167) 地址:https://leetcode-cn.com/problems/two-sum-ii-input-array-is-sorted/
给定一个已按照升序排列 的有序数组,找到两个数使得它们相加之和等于目标数。
函数应该返回这两个下标值 index1 和 index2,其中 index1 必须小于 index2。
解题思路:
因为是有序数组,从小到大排列。
收尾之和对应的为中间值,而头部向后则和增加;
反之,尾部向前移动则变小;
最小的和为 索引0 和 1;
最大的和为 索引n-2 n-1, n为List长度;
结束条件是头和尾相撞。
class Solution:
def twoSum(self, numbers: List[int], target: int) -> List[int]:
if not numbers: return [] #输入列表不存在,返回空值
start, end = 0, len(numbers)-1 #头尾指针
while start < end: #保证尾指针在头指针后边
_sum = numbers[start] + numbers[end]
if _sum < target: #小于目标值,首指针后移
start += 1
elif _sum > target: #大于目标值,尾指针前移
end -= 1
else: #等于目标值,返回结果
return [start + 1, end + 1]
return []
双指针之快慢指针
也就是指针有前后,走在前面的为快指针,后面的为慢指针
比如以下问题:Leetcode 283 https://leetcode-cn.com/problems/move-zeroes/
给定一个数组 nums
,编写一个函数将所有 0
移动到数组的末尾,同时保持非零元素的相对顺序。
程序来源Github,地址最下;
class Solution:
def moveZeroes(self, nums: List[int]) -> None:
"""
Do not return anything, modify nums in-place instead.
"""
slower, faster = 0, 0 #快指针指向不为零的元素,慢指针指向零元素,满足条件就交换
while faster < len(nums):
if nums[slower] != 0:
slower += 1
elif nums[faster] != 0:
nums[slower], nums[faster] = nums[faster], nums[slower]
slower += 1
faster += 1
解题思路:
快指针每一步都会增加,直到为不为零的元素;
慢指针碰到零元素则对准它;
如果慢指针对零,而快指针非零,则交换,然后指针各加1;
结束条件为快指针出界,因为快指针走的快;