给定一个整数数组
nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。你可以假设每种输入只会对应一个答案,并且你不能使用两次相同的元素。
你可以按任意顺序返回答案。
示例 1:
示例 2:
示例 3:
提示:
2 <= nums.length <= 104
109 <= nums[i] <= 109
109 <= target <= 109
- 只会存在一个有效答案
进阶:你可以想出一个时间复杂度小于
O(n2) 的算法吗?暴力
哈希
知识点
没问题,咱们把这段时间的“排雷”经验和核心干货总结一下。你现在的状态是**“大局观很强,但细节被编译器嫌弃”**,这很正常,多写两题肌肉记忆就回来了。
一、 Python 语法纠错本(C 风格 vs Python 风格)
这是你之前代码中出现的几个典型“幻视”错误,面试写白板代码时一定要避坑:
类别 | 你之前的写法 (C/Java 习惯) | Python 正确写法 |
自增 | i++ | i += 1 (Python 不支持 ++) |
循环 | for(j=i+1; j<n; j++) | for j in range(i + 1, n): |
长度 | length.nums | len(nums) (全局函数) |
变量声明 | int i = 0 | i = 0 (直接赋值,无需类型声明) |
代码块标记 | 漏掉行尾冒号 : | for / if / def 行尾必带 : |
输出/结果 | print(...) | return [...] (面试题通常要求返回值) |
💡 核心口诀: 看到缩进,必有冒号;不写大括号,改写range;没有++只有+=。
二、 哈希表(Hash Table)核心知识点
哈希表是你从 $O(n^2)$ 进化到 $O(1)$ 的神器,它的本质是**“空间换时间”**。
1. 为什么快?($O(1)$ 的秘密)
- 计算代替查找:它不是挨个对比,而是通过哈希函数把你的
Key翻译成一个固定的内存地址(下标)。
- 物理空降:就像你说的,知道抽屉号直接去拉,不需要翻遍整个柜子。
2. Python 中的实现
dict(字典):存储Key: Value键值对。例如hashmap[num] = index。用于当你需要知道“值在哪里”时。
set(集合):只存Key。例如if num in visited_set。用于当你只需要知道“这个值出没出现过”时。
3. 面试必考:哈希冲突(Collision)
- 现象:两个不同的 Key 算出了同一个“抽屉号”。
- 解决:
- 拉链法:抽屉里挂个链表(文件夹)。
- 开放寻址:这个抽屉满了,按规则找下一个空的。
- 复杂度退化:如果所有数据都撞在一起,查找会从 $O(1)$ 退化到 $O(n)$,但这在工程实践中极少见。
三、 刷题套路总结:两数之和(Two Sum)
这道题的进化过程,是你找回手感的最佳范本:
- 暴力解法 ($O(n^2)$):两层
for循环,像在大街上盲目找人。
- 哈希表法 ($O(n)$):
- 一边走,一边记:遍历一次数组。
- 查账本:用
target - 当前数算出我需要谁。 - 存在即返回:在
dict里查那个差值,查到了直接收工。
下一阶段计划
基础语法和哈希概念我们已经同步完成了。为了巩固 Python 的
dict 和 set 用法,你想试一试下面哪类题目?- 计数类:比如“找出字符串中第一个不重复的字符”(练习
dict计数)。
- 去重类:比如“判断数组是否有重复元素”(练习
set的极简写法)。
- 分类类:比如“字母异位词分组”(练习
dict存列表的高级用法)。
选一个,我们继续练!







