不能用双重循环硬刚,因时间复杂度O(n²)超时且不符最优解要求;LeetCode第一题需用哈希表实现O(n)时间复杂度的高效解法。

为什么两数之和不能用双重循环硬刚
LeetCode 第一题看似简单,但用 for i := 0; i 套一层 <code>for j := i+1; j 会直接超时(尤其测试用例拉到 10⁵ 级别),而且 Go 里没内置的 <code>indexOf 或 contains 方法帮你偷懒。关键不是“能不能过”,而是“Go 的惯用法要求你用空间换时间”——map 就是标准解法的基石。
用 map[int]int 存什么、查什么
核心逻辑就一句:遍历当前数 nums[i] 时,立刻查 target - nums[i] 是否已在 map 中;如果在,说明它和当前数配对成功;如果不在,就把 nums[i] 和它的下标 i 存进 map。注意:map 的 key 是数值,value 是下标,不是反过来——否则查 target - nums[i] 时没法 O(1) 拿到位置。
常见错误现象:
• 返回 [0, 0] 或空结果 → 把 value 当成 key 查了,或者初始化 map 写成 make(map[int]bool) 忘记存下标
• 下标越界 panic → 遍历时用了 range nums 却误把值当索引用
- 必须用
map[int]int,不能用map[int]bool(要返回下标) - 插入时机:查完没找到再存,不能先存后查(否则可能匹配到自己)
- Go 的 map 零值是
nil,记得用m := make(map[int]int)初始化
一次遍历的完整代码长什么样
这不是伪代码,是可直接提交的最小可行实现:
初始化并管理阿里云SDK Go 客户端,涵盖 sync.Once 单例、goroutine 安全、endpoint 与 region 配置、VPC 端点及调试。
立即学习“go语言免费学习笔记(深入)”;
func twoSum(nums []int, target int) []int {
m := make(map[int]int)
for i, v := range nums {
want := target - v
if j, ok := m[want]; ok {
return []int{j, i}
}
m[v] = i
}
return nil
}关键点:
• j, ok := m[want] 是 Go 查 map 的标准写法,ok 判断是否存在,不依赖零值
• return []int{j, i} 顺序是「先出现的下标」在前,因为 want 是之前存进去的
• 不需要额外处理无解情况,题目保证有解,return nil 仅作兜底
map 在这里为什么比 slice 查找快
slice 里找一个数平均要 O(n),嵌套就是 O(n²);而 map 底层是哈希表,单次查找均摊 O(1)。但要注意:如果输入全是负数或极大整数,Go 的 map[int]int 依然稳定,不像某些语言的哈希表会因 key 类型触发重散列抖动。真正容易被忽略的是——如果你把 nums 改成 []int64,就必须同步改成 map[int64]int,否则编译不通过;类型严格是 Go 的保护,也是约束。

















