返回

轻松理解LeetCode 167:有序数组中的两数之和,用高效算法拨开迷雾

后端

在计算机科学中,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 []

希望这篇文章对您有所帮助!如果您有任何问题或建议,请随时与我们联系。