双指针算法(双指针技术)是一种在处理线性数据结构(如数组、链表)时常用的算法策略。它通过同时使用两个指针,以不同的方式遍历数据结构,从而优化时间复杂度或简化问题的解决过程。双指针算法广泛应用于各种经典问题,如数组排序、链表操作、字符串处理等。
快慢指针(快指针与慢指针)
左右指针(双端指针)
滑动窗口
给定一个排序数组 nums
和一个目标值 target
,请你使用双指针的方法,找到数组中和为目标值的两个数,并返回它们的下标。保证只有一个解。
如果没有符合条件的两个数,返回 -1
。
这道题属于 左右指针(双端指针) 的双指针算法类型。
初始化指针:
left
指向数组的起始位置(索引为 0)。right
指向数组的末尾位置(索引为 n-1
)。left = 0
right = len(nums) - 1
迭代查找:
计算当前左指针和右指针所指元素的和 sum_val = nums[left] + nums[right]
。
比较 sum_val
与 target
:
sum_val
等于 target
,则找到目标对,返回它们的下标(注意转换为从 1 开始的索引)。if sum_val == target:
return left + 1, right + 1 # 返回1-based索引
如果 sum_val
小于 target
,说明需要更大的数来增加和,因此将左指针 left
向右移动一位,以选择更大的数。
elif sum_val < target:
left += 1
如果 sum_val
大于 target
,说明需要更小的数来减少和,因此将右指针 right
向左移动一位,以选择更小的数。
else:
right -= 1
终止条件:
left
不再小于右指针 right
时,停止迭代。如果此时仍未找到满足条件的两个数,返回 -1
。因为数组是排序数组,左指针右移时和一定是增大的,右指针左移时和一定是减小的,这样的移动可以保证不漏掉任何可能的解。
def find_two_sum(nums, target):
left = 0
right = len(nums) - 1
while left < right:
# 计算当前左指针和右指针所指元素的和
sum_val = nums[left] + nums[right]
if sum_val == target:
# 找到符合条件的下标,注意转换为从1开始的下标
return left + 1, right + 1 # 返回1-based索引
elif sum_val < target:
# 当前和小于目标值,左指针右移
left += 1
else:
# 当前和大于目标值,右指针左移
right -= 1
# 如果没有找到符合条件的两个数
return -1
# 读取输入
n = int(input()) # 数组的长度
nums = list(map(int, input().split())) # 排序数组
target = int(input()) # 目标值
# 调用函数
result = find_two_sum(nums, target)
# 输出结果
if result == -1:
print(-1)
else:
print(result[0], result[1])
题目描述:
给定一个排序数组 nums 和一个目标值 target,请你使用双指针的方法,找到数组中和为目标值的两个数,并返回它们的下标。保证只有一个解。
如果没有符合条件的两个数,返回 −1。
注意:
示例 1:
输入:
4
2 7 11 15
9
输出:
1 2
解释:数组中的 2 和 7 的和等于目标值 9,它们的下标分别为 1 和 2。
示例 2:
输入:
3
1 2 3
6
输出:
-1
解释:数组中的数字没有两个数的和为目标值 6。