当前位置: 面试刷题>> 双指针(经典算法150题)


题目描述补充

题目:双指针技术求解有序数组中的两数之和

给定一个已按照升序排列的整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那两个整数,并返回它们的数组下标。

你可以假设每种输入只会对应一个答案。但是,数组中同一个元素不能使用两遍。

示例 1:

输入: nums = [2, 7, 11, 15], target = 9
输出: [0, 1]
解释: 因为 nums[0] + nums[1] = 2 + 7 = 9

示例 2:

输入: nums = [1, 2, 3, 4, 5], target = 6
输出: [1, 2]
解释: 因为 nums[1] + nums[2] = 2 + 3 = 6

示例 3:

输入: nums = [-1, 0], target = -1
输出: [0, 1]
解释: 因为 nums[0] + nums[1] = -1 + 0 = -1

解答

PHP 示例代码

function twoSum($nums, $target) {
    $left = 0;
    $right = count($nums) - 1;
    
    while ($left < $right) {
        $sum = $nums[$left] + $nums[$right];
        if ($sum == $target) {
            return [$left, $right];
        } elseif ($sum < $target) {
            $left++;
        } else {
            $right--;
        }
    }
    
    // 如果没有找到符合条件的两数之和,这里按题目假设会找到答案,所以实际不会执行到这里
    return [];
}

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

Python 示例代码

def twoSum(nums, target):
    left, right = 0, len(nums) - 1
    
    while left < right:
        current_sum = nums[left] + nums[right]
        if current_sum == target:
            return [left, right]
        elif current_sum < target:
            left += 1
        else:
            right -= 1
    
    # 如果没有找到符合条件的两数之和,理论上按题目假设不会执行到这里
    return []

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

JavaScript 示例代码

function twoSum(nums, target) {
    let left = 0;
    let right = nums.length - 1;
    
    while (left < right) {
        const sum = nums[left] + nums[right];
        if (sum === target) {
            return [left, right];
        } else if (sum < target) {
            left++;
        } else {
            right--;
        }
    }
    
    // 如果没有找到符合条件的两数之和,理论上按题目假设不会执行到这里
    return [];
}

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

以上示例均展示了如何使用双指针技术在一个已排序的数组中查找和为特定值的两个数的索引。这种技术在处理这类问题时非常高效,尤其是在数组已排序的情况下。

推荐面试题