返回

算法题解:两数之和 II - 输入有序数组

Android

算法世界中,每日一道算法题的挑战总能激发算法爱好者的热情。今天,我们共同探索 leetcode 中的第 038 号问题:两数之和 II - 输入有序数组。

题目概述

给你一个 有序数组 numbers 和一个目标值 target,请找出数组中 两个 数字,使得它们的和等于 target。你可以假设每个输入只对应一种答案,且同样的元素不能被重复利用。

解题思路

由于数组 numbers 是有序的,我们可以利用双指针的技巧来高效解决这个问题。具体来说,我们使用两个指针 lowhigh,分别指向数组的第一个元素和最后一个元素。

  1. 如果 numbers[low] + numbers[high] 等于 target,则说明我们找到了答案,直接返回 [low, high] 即可。

  2. 如果 numbers[low] + numbers[high] 小于 target,则说明我们当前的和太小,我们需要将 low 指针向后移动一位,即 low++

  3. 如果 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]

在代码中,我们定义了两个指针 lowhigh,分别指向数组的第一个元素和最后一个元素。然后,我们进入一个循环,不断调整指针的位置,直到找到满足条件的两个数字。如果当前和等于 target,则返回结果。如果当前和小于 target,则向后移动低指针。如果当前和大于 target,则向前移动高指针。如果循环结束时仍未找到满足条件的两个数字,则返回 -1

复杂度分析

  • 时间复杂度:O(n),其中 n 是数组的长度。
  • 空间复杂度:O(1),因为我们只使用了额外的两个指针。

结语

利用双指针技巧,我们高效地解决了这道两数之和的算法题。希望这篇文章能帮助你理解算法题的解题思路,提升你的算法解题能力。让我们一起继续探索算法世界的更多奥秘!