leetcode链接: leetcode.cn/problems/tw…
题目描述
给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出和为目标值 target 的那两个整数,并返回它们的数组下标。
你可以假设每种输入只会对应一个答案,并且你不能使用两次相同的元素。你可以按任意顺序返回答案。
示例:
输入:nums = [2,7,11,15], target = 9
输出:[0,1]
解释:因为 nums[0] + nums[1] == 9 ,返回 [0, 1] 。
解题思路
暴力解法
最直观的思路是使用双重循环遍历数组,检查每对元素的和是否等于目标值。这种方法的时间复杂度是 O(n²),在数据量较大时效率较低。
哈希表优化
我们可以利用哈希表来优化查找过程。核心思想是:
- 遍历数组时,对于当前元素
nums[i],计算target - nums[i]的值 - 检查这个差值是否已经存在于哈希表中
- 如果存在,说明找到了匹配的两个数
- 如果不存在,将当前元素及其索引存入哈希表
这种方法只需要一次遍历,时间复杂度降为 O(n),空间复杂度为 O(n)。
代码实现
/**
* @param {number[]} nums
* @param {param {number} target
* @return {number[]}
*/
var twoSum = function (nums, target) {
// nums[i] + nums[j] = target
// nums[i] = target-nums[j]
let map = new Map()
for (let i = 0; i < nums.length; i++) {
if (map.has(target - nums[i])) {
return [i, map.get(target - nums[i])]
}
map.set(nums[i], i)
}
};
复杂度分析
- 时间复杂度:O(n),其中 n 是数组长度。我们只需要遍历一次数组。
- 空间复杂度:O(n),最坏情况下需要存储所有元素到哈希表中。
关键点解析
- 哈希表的选择:JavaScript 中使用
Map数据结构,因为它提供了 O(1) 时间复杂度的查找和插入操作。 - 查找顺序:先查找差值是否存在,再存储当前元素。这样可以避免使用同一个元素两次。
- 返回顺序:题目不要求返回顺序,所以
[i, map.get(target - nums[i])]和[map.get(target - nums[i]), i]都是正确的。