两数之和是编程面试最经典的入门题。它考察你从暴力法优化到高效解法的能力、对哈希表的掌握,以及分析时间和空间权衡的技巧。
先讲暴力法 O(n²) 双重循环,展示你理解了问题。
优化到 O(n) 哈希表法:遍历数组,对每个元素检查 target 减去当前值是否在哈希表中。
用一个例子验证你的逻辑。
讨论边界情况:重复值、没有有效配对、负数。
暴力法用两层循环检查所有配对——O(n²) 时间,O(1) 空间。优化方案用哈希表:遍历数组时,对每个数计算补数(target 减当前值),若补数在哈希表中则返回两个下标,否则将当前数和下标存入哈希表。时间 O(n),空间 O(n)。例如 [2, 7, 11, 15],target=9:下标0时补数7不在表中,存 {2:0};下标1时补数2在表中下标0,返回 [0,1]。我总会确认数组是否已排序(排序数组可用双指针 O(1) 空间),以及是否可能有多组有效配对。
总是先讲暴力法再优化——展示结构化思维。
询问数组是否有序;有序的话双指针法只需 O(1) 空间。
确认返回下标还是值,以及同一个元素是否能用两次。
和面试官确认。经典题只要求返回任一组。如果要所有配对,找到第一组后继续遍历即可。
排序需要 O(n log n) 且会丢失原始下标。哈希表法 O(n) 且保留下标,更优。
三数之和通常先排序,对每个元素用双指针,时间复杂度 O(n²)。