返回
轻松理解LeetCode 167:有序数组中的两数之和,用高效算法拨开迷雾
后端
2023-12-17 17:26:58
在计算机科学中,LeetCode 是一个广受欢迎的在线编程竞赛平台,提供各种编程练习题和挑战。在 LeetCode 的每日一题系列中,我们聚焦于第 167 题:两数之和 II - 输入有序数组。
在这一题中,给你一个按照非递减顺序排列的整数数组 numbers,以及一个目标数 target,你的任务是找出数组中两个数,它们的和等于目标数。
为了帮助你解决这个问题,我们提供了两种高效算法:双指针法和二分查找法。
双指针法
双指针法是一种常见的算法,它适用于已经排序的数组。这种方法使用两个指针,一个指向数组的开头,另一个指向数组的结尾。然后,我们比较这两个指针所指向的元素的和与目标数。如果它们的和等于目标数,我们就找到了答案。否则,我们就调整指针的位置,并继续比较。
二分查找法
二分查找法是一种高效的搜索算法,它也适用于已经排序的数组。这种方法使用一个指针,指向数组的中间元素。然后,我们比较中间元素的值与目标数。如果它们相等,我们就找到了答案。否则,我们就将指针移动到数组的上半部分或下半部分,并继续比较。
这两种算法都是非常高效的,它们的时间复杂度都是 O(n)。因此,你可以根据自己的喜好选择其中一种算法来解决这个问题。
现在,让我们用 Python 代码来实现这两种算法。
## Python代码
# 双指针法
def two_sum_1(numbers, target):
"""
:type numbers: List[int]
:type target: int
:rtype: List[int]
"""
left, right = 0, len(numbers) - 1
while left < right:
current_sum = numbers[left] + numbers[right]
if current_sum == target:
return [left + 1, right + 1]
elif current_sum < target:
left += 1
else:
right -= 1
return []
# 二分查找法
def two_sum_2(numbers, target):
"""
:type numbers: List[int]
:type target: int
:rtype: List[int]
"""
for i in range(len(numbers)):
left, right = i + 1, len(numbers) - 1
while left <= right:
mid = (left + right) // 2
current_sum = numbers[i] + numbers[mid]
if current_sum == target:
return [i + 1, mid + 1]
elif current_sum < target:
left = mid + 1
else:
right = mid - 1
return []
希望这篇文章对您有所帮助!如果您有任何问题或建议,请随时与我们联系。