1. 两数之和

难度:简单

题目

给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。

你可以假设每种输入只会对应一个答案,并且你不能使用两次相同的元素。你可以按任意顺序返回答案。

示例

示例 1:

输入:nums = [2,7,11,15], target = 9
输出:[0,1]
解释:因为 nums[0] + nums[1] == 9 ,返回 [0, 1] 。

示例 2:

输入:nums = [3,2,4], target = 6
输出:[1,2]

示例 3:

输入:nums = [3,3], target = 6
输出:[0,1]

提示

  • 2 <= nums.length <= 10^4
  • -10^9 <= nums[i] <= 10^9
  • -10^9 <= target <= 10^9
  • 只会存在一个有效答案

进阶

你可以想出一个时间复杂度小于 O(n²) 的算法吗?


解法一:暴力枚举

class Solution:
def twoSum(self, nums: List[int], target: int) -> List[int]:
for i in range(len(nums)):
for j in range(i + 1, len(nums)):
if nums[i] + nums[j] == target:
return [i, j]

复杂度分析

  • 时间复杂度:O(n²)
  • 空间复杂度:O(1)

解法二:哈希表

class Solution:
def twoSum(self, nums: List[int], target: int) -> List[int]:
hash_table = {}
for i, num in enumerate(nums):
find = target - num
if find in hash_table:
return [hash_table[find], i]
hash_table[nums[i]] = i

复杂度分析

  • 时间复杂度:O(n)
  • 空间复杂度:O(n)

作者笔记

语法点:冒号 :

  • 函数定义 def func(): — 告诉 Python 下一行开始缩进(语法必须有)
  • 参数类型标注 nums: int — 标注参数类型(给人/编辑器看,不影响运行)
  • 返回值标注 -> List[int] — 标注函数返回类型,说明要返回 List 格式,所以 return [i, j]

语法点:缩进

Python 没有花括号 {} 表示代码块,缩进就是代码块的标志。

理解暴力枚举

for i in range(len(nums))len 求数组长度,for in range 遍历整个长度。

理解哈希表

{} 在 Python 里就是空字典(键值对),所以 hash_table = {}

按顺序从头开始找,用 target 减去当前数字,然后在哈希表里查找匹配项:

  • 如果没有找到,就把当前数字和它的下标存入哈希表
  • 如果找到,就返回 [找到的序号, 当前序号]