1. 两数之和
Origin: LeetCode 1
题目描述
给定一个整数数组 nums 和一个整数目标值 target,在数组中找出和为目标值的两个整数,返回它们的下标。每种输入只对应一个答案,不能使用两次相同元素。
示例
Input: nums = [2, 7, 11, 15], target = 9
Output: [0, 1]
Explanation: nums[0] + nums[1] = 2 + 7 = 9
约束
- 2 <= nums.length <= 10
- -10^9 <= nums[i] <= 10
- -10^9 <= target <= 10
关键信息
- 返回下标,不是值
- 不能用同一元素两次
- 恰好有一个答案
Resolution
我的解法
function twoSum(nums: number[], target: number): number[] {
const map = new Map()
for (let i = 0; i < nums.length; i++) {
const cur = nums[i]
if (map.has(target - cur)) {
return [map.get(target - cur), i]
}
map.set(cur, i)
}
return []
}解题思路
哈希表一次遍历。对每个元素 nums[i],检查 target - nums[i] 是否已在 Map 中:
- 有 → 返回 [map.get(target - cur), i]
- 没有 → 把当前元素存入 Map(值 → 下标)
关键:先检查再存入,避免使用同一元素两次。
踩坑
- 原版先存再查,需要额外判断
map.get(target - cur) !== i防止用同一元素 - 改成先查再存就不需要这个判断了
复杂度
- 时间:O(n)
- 空间:O(n)