在“两数之和”问题中,目标是给定一个整数数组和一个目标值,找到数组中两个数的下标,使它们的和等于目标值。
暴力解法
思路: 使用双重循环,遍历所有数对,判断其和是否等于目标值。
时间复杂度:
空间复杂度:
哈希表优化解法
思路: 利用哈希表存储已遍历的数及其下标。遍历数组时,对于每个数 ,计算差值 ,然后检查 是否在哈希表中。如果在,说明找到了满足条件的数对。
具体步骤:
- 创建一个空的哈希表(对象)。
- 遍历数组:
- 对于每个元素 :
- 计算差值 。
- 检查 是否已在哈希表中:
- 如果存在,返回 和 的下标。
- 如果不存在,将 及其下标存入哈希表。
- 对于每个元素 :
- 如果遍历完数组仍未找到,返回空结果。
时间复杂度:
空间复杂度:
优化原理
通过使用哈希表,将查找时间从 降低到 ,从而将总时间复杂度从 优化到 。虽然增加了 的空间复杂度,但显著提升了时间效率。
代码示例(JavaScript)
function twoSum(nums, target) {
const map = {}; // 创建哈希表
for (let i = 0; i < nums.length; i++) {
const complement = target - nums[i]; // 计算差值
if (complement in map) { // 检查差值是否在哈希表中
return [map[complement], i]; // 找到结果,返回下标
}
map[nums[i]] = i; // 将当前数及其下标存入哈希表
}
return []; // 未找到结果
}
总结
在“两数之和”问题中,通过使用哈希表(对象)存储已遍历的元素,利用其常数时间的查找特性,将时间复杂度从 优化到 。这种以空间换时间的策略在解决实际问题时非常有效,特别是在需要高效处理大规模数据的情况下。