当前位置: 面试刷题>> 两数之和 II - 输入有序数组(经典算法150题)


题目描述

两数之和 II - 输入有序数组

给定一个已按照升序排列的有序数组,找到两个数使得它们相加之和等于一个特定目标数。

函数应该返回这两个数的索引值,其中索引1必须小于索引2。

注意:

  • 你可以假设每种输入只会对应一个答案。
  • 你可以不可以重复使用相同的元素。

示例:

输入: numbers = [2, 7, 11, 15], target = 9
输出: [1, 2]
解释: 2 与 7 相加得到 9。因此 index1 = 1, index2 = 2。

PHP 示例代码

function twoSum($numbers, $target) {
    $left = 0;
    $right = count($numbers) - 1;
    
    while ($left < $right) {
        $sum = $numbers[$left] + $numbers[$right];
        if ($sum == $target) {
            return [$left + 1, $right + 1]; // 题目要求索引从1开始
        } elseif ($sum < $target) {
            $left++;
        } else {
            $right--;
        }
    }
    
    // 如果没有找到符合条件的两个数,则返回空数组(题目未明确说明,但根据常规理解)
    return [];
}

// 示例用法
$numbers = [2, 7, 11, 15];
$target = 9;
$result = twoSum($numbers, $target);
print_r($result);

Python 示例代码

def twoSum(numbers, target):
    left, right = 0, len(numbers) - 1
    
    while left < right:
        current_sum = numbers[left] + numbers[right]
        if current_sum == target:
            return [left + 1, right + 1]  # 题目要求索引从1开始
        elif current_sum < target:
            left += 1
        else:
            right -= 1
    
    # 如果没有找到符合条件的两个数,则返回空列表(题目未明确说明,但根据常规理解)
    return []

# 示例用法
numbers = [2, 7, 11, 15]
target = 9
result = twoSum(numbers, target)
print(result)

JavaScript 示例代码

function twoSum(numbers, target) {
    let left = 0;
    let right = numbers.length - 1;
    
    while (left < right) {
        const sum = numbers[left] + numbers[right];
        if (sum === target) {
            return [left + 1, right + 1]; // 题目要求索引从1开始
        } else if (sum < target) {
            left++;
        } else {
            right--;
        }
    }
    
    // 如果没有找到符合条件的两个数,则返回空数组(题目未明确说明,但根据常规理解)
    return [];
}

// 示例用法
const numbers = [2, 7, 11, 15];
const target = 9;
const result = twoSum(numbers, target);
console.log(result);

在以上示例中,我们使用了双指针的方法来解决这个问题,因为数组已经是有序的,所以我们可以从数组的两端开始向中间遍历,根据当前两数之和与目标值的比较结果来移动指针,从而找到满足条件的两个数。这种方法的时间复杂度为O(n),其中n是数组的长度。

推荐面试题