算法题解:两数之和 II - 输入有序数组
2023-09-29 02:41:16
算法世界中,每日一道算法题的挑战总能激发算法爱好者的热情。今天,我们共同探索 leetcode 中的第 038 号问题:两数之和 II - 输入有序数组。
题目概述
给你一个 有序数组 numbers
和一个目标值 target
,请找出数组中 两个 数字,使得它们的和等于 target
。你可以假设每个输入只对应一种答案,且同样的元素不能被重复利用。
解题思路
由于数组 numbers
是有序的,我们可以利用双指针的技巧来高效解决这个问题。具体来说,我们使用两个指针 low
和 high
,分别指向数组的第一个元素和最后一个元素。
-
如果
numbers[low] + numbers[high]
等于target
,则说明我们找到了答案,直接返回[low, high]
即可。 -
如果
numbers[low] + numbers[high]
小于target
,则说明我们当前的和太小,我们需要将low
指针向后移动一位,即low++
。 -
如果
numbers[low] + numbers[high]
大于target
,则说明我们当前的和太大,我们需要将high
指针向前移动一位,即high--
。
通过不断调整指针的位置,我们最终可以找到满足条件的两个数字。
代码实现
def twoSum(numbers, target):
"""
:type numbers: List[int]
:type target: int
:rtype: List[int]
"""
low, high = 0, len(numbers) - 1
while low < high:
sum = numbers[low] + numbers[high]
if sum == target:
return [low + 1, high + 1]
elif sum < target:
low += 1
else:
high -= 1
return [-1, -1]
代码分析
def twoSum(numbers, target):
# 定义两个指针
low, high = 0, len(numbers) - 1
# 循环直到找到目标和
while low < high:
# 计算当前和
sum = numbers[low] + numbers[high]
# 如果当前和等于目标和
if sum == target:
# 返回结果
return [low + 1, high + 1]
# 如果当前和小于目标和
elif sum < target:
# 向后移动低指针
low += 1
# 如果当前和大于目标和
else:
# 向前移动高指针
high -= 1
# 未找到目标和,返回 -1
return [-1, -1]
在代码中,我们定义了两个指针 low
和 high
,分别指向数组的第一个元素和最后一个元素。然后,我们进入一个循环,不断调整指针的位置,直到找到满足条件的两个数字。如果当前和等于 target
,则返回结果。如果当前和小于 target
,则向后移动低指针。如果当前和大于 target
,则向前移动高指针。如果循环结束时仍未找到满足条件的两个数字,则返回 -1
。
复杂度分析
- 时间复杂度:O(n),其中 n 是数组的长度。
- 空间复杂度:O(1),因为我们只使用了额外的两个指针。
结语
利用双指针技巧,我们高效地解决了这道两数之和的算法题。希望这篇文章能帮助你理解算法题的解题思路,提升你的算法解题能力。让我们一起继续探索算法世界的更多奥秘!