当前位置: 面试刷题>> 两数之和(经典算法150题)


题目描述

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

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

示例 1:

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

示例 2:

输入: nums = [3, 2, 4], target = 6
输出: [1, 2]

示例 3:

输入: nums = [3, 3], target = 6
输出: [0, 1]

PHP 代码示例

function twoSum($nums, $target) {
    $map = [];
    $length = count($nums);
    for ($i = 0; $i < $length; $i++) {
        $complement = $target - $nums[$i];
        if (isset($map[$complement])) {
            return [$map[$complement], $i];
        }
        $map[$nums[$i]] = $i;
    }
    return [];
}

// 示例用法
$nums = [2, 7, 11, 15];
$target = 9;
$result = twoSum($nums, $target);
print_r($result); // 输出: Array ( [0] => 0 [1] => 1 )

Python 代码示例

def twoSum(nums, target):
    hash_map = {}
    for i, num in enumerate(nums):
        complement = target - num
        if complement in hash_map:
            return [hash_map[complement], i]
        hash_map[num] = i
    return []

# 示例用法
nums = [2, 7, 11, 15]
target = 9
result = twoSum(nums, target)
print(result)  # 输出: [0, 1]

JavaScript 代码示例

function twoSum(nums, target) {
    const map = new Map();
    for (let i = 0; i < nums.length; i++) {
        const complement = target - nums[i];
        if (map.has(complement)) {
            return [map.get(complement), i];
        }
        map.set(nums[i], i);
    }
    return [];
}

// 示例用法
const nums = [2, 7, 11, 15];
const target = 9;
const result = twoSum(nums, target);
console.log(result); // 输出: [0, 1]

以上三种语言的实现都使用了哈希表(在PHP中是关联数组,在Python中是字典,在JavaScript中是Map)来记录已经遍历过的数字及其索引,从而快速查找补数是否存在。这种方法的时间复杂度是O(n),空间复杂度也是O(n)。

推荐面试题