给定一个整数数组 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)

这道题的进化过程,是你找回手感的最佳范本:
  1. 暴力解法 ($O(n^2)$):两层 for 循环,像在大街上盲目找人。
  1. 哈希表法 ($O(n)$)
      • 一边走,一边记:遍历一次数组。
      • 查账本:用 target - 当前数 算出我需要谁。
      • 存在即返回:在 dict 里查那个差值,查到了直接收工。

下一阶段计划

基础语法和哈希概念我们已经同步完成了。为了巩固 Python 的 dictset 用法,你想试一试下面哪类题目?
  1. 计数类:比如“找出字符串中第一个不重复的字符”(练习 dict 计数)。
  1. 去重类:比如“判断数组是否有重复元素”(练习 set 的极简写法)。
  1. 分类类:比如“字母异位词分组”(练习 dict 存列表的高级用法)。
选一个,我们继续练!
Loading...