1. 两数之和(LeetCode 1)中用哈希表存“补数→下标”能把 O(n²) 降到 O(n),先查后存如何避免误用同一元素?
两数之和,说明为何用哈希表存"补数→下标"能把 O(n²) 降到 O(n),以及先查后存如何避免误用同一元素?
- 哈希表存补数→下标
- O(n²) → O(n)
- 先查后存避免重复使用
两数之和:遍历数组,对每个元素 x,查"target-x"是否已在哈希表中;若在则返回下标对,否则把 x 存入哈希表(x→下标)。复杂度从 O(n²)(双重循环)降到 O(n):哈希表查找平均 O(1),把"找补数"从线性扫描变为哈希查询。先查后存避免误用同一元素:若先存后查,当 x==target-x(两倍关系)时,当前元素会查到"自己",误用同一元素;先查后存保证"补数"是之前已存的元素(下标不同),不会把当前元素自身当作补数。故先查后存是关键。
哈希表把"补数查找"从 O(n) 变 O(1),是空间换时间。先查后存保证补数来自"已遍历的、不同下标的"元素,避免 self-pair 误用。这是"哈希表 + 遍历"的经典题。
int[] twoSum(int[] nums, int target) {
Map<Integer, Integer> map = new HashMap<>();
for (int i = 0; i < nums.length; i++) {
int complement = target - nums[i];
if (map.containsKey(complement)) return new int[]{map.get(complement), i};
map.put(nums[i], i); // 先查后存
}
return new int[]{};
}