Day1-两数之和

YVTU

🔗 LeetCode 1 - Two Sum

📌 题目描述

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

你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。

你可以按任意顺序返回答案。

示例:

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


💡 解题思路

  • 使用哈希表(字典)存储已访问的数字及其下标;
  • 遍历数组,对于每个元素 x,检查 target - x 是否存在于哈希表中;
  • 如果存在,说明找到了答案;
  • 否则将当前数字和下标加入哈希表继续查找。

时间复杂度:O(n)
空间复杂度:O(n)


✅ JavaScript 实现

1
2
3
4
5
6
7
8
9
10
11
var twoSum = function(nums, target) {
const map = {};
for (let i = 0; i < nums.length; i++) {
let complement = target - nums[i];
if (map[complement] !== undefined) {
return [map[complement], i];
}
map[nums[i]] = i;
}
return [];
};

🟣 Swift 实现

1
2
3
4
5
6
7
8
9
10
11
12
13
class Solution {
func twoSum(_ nums: [Int], _ target: Int) -> [Int] {
var map = [Int: Int]()
for (i, num) in nums.enumerated() {
let complement = target - num
if let index = map[complement] {
return [index, i]
}
map[num] = i
}
return []
}
}

🧠 思考与拓展

  1. 如果要求返回所有满足条件的数对呢?

    可以在遍历时记录所有匹配的组合,存储在数组中。

  2. 如果输入数据有多个解,你该如何处理?

    • 当前题目假设「只有一个解」,但在实际项目中通常需要找到所有解。
    • 可采用双层循环或在 map 中记录所有下标(数组),进行组合尝试。
  3. 如果不能使用额外空间,只能 O(1) 空间?

    • 先对数组进行排序(需要额外记录原始下标),然后使用 双指针 思路解决;
    • 时间复杂度为 O(nlogn),但空间复杂度可降为 O(1)(如果允许修改原数组)。
  4. 高频拓展题