力扣
1. 两数之和
题目描述
给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出和为目标值 target 的那两个整数,并返回它们的数组下标。
你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。
你可以按任意顺序返回答案。
解题思路
问题分析:
- 需要在数组中找到两个数,使得它们的和等于目标值
- 要求返回这两个数的索引
- 假设每种输入只会对应一个答案
思路选择:
- 暴力解法:双层循环遍历数组,时间复杂度 O(n²)
- 哈希表解法:使用哈希表记录已经遍历过的元素及其索引,时间复杂度 O(n)
优化关键:
- 不要做重复的遍历
- 使用哈希表记录已经遍历的元素,通过互补数快速查找
- 两个元素互补是好算法的关键
代码实现
python
class Solution:
def twoSum(self, nums, target):
'''
解决这道题,要想压缩时间复杂度,关键在于不要做重复的遍历
创建一个key-value表(哈希表),记录已经遍历的元素
通过if-else判断会比一层for循环少花费很多时间
两个元素,互补是好算法
'''
hash_map = {}
for i, num in enumerate(nums):
# 计算互补数
complement = target - num
# 检查互补数是否在哈希表中
if complement in hash_map:
# 如果存在,返回结果
return [hash_map[complement], i]
# 如果不存在,将当前元素及其索引存入哈希表
hash_map[num] = i
# 如果没有找到,返回空列表
return []复杂度分析
- 时间复杂度:O(n),其中 n 是数组的长度。我们只需要遍历数组一次,对于每个元素,哈希表的查找和插入操作都是 O(1) 的时间复杂度。
- 空间复杂度:O(n),其中 n 是数组的长度。哈希表最多需要存储 n 个元素。
示例
输入:nums = [2,7,11,15], target = 9输出:[0,1]解释:因为 nums[0] + nums[1] == 9,所以返回 [0, 1]。
输入:nums = [3,2,4], target = 6输出:[1,2]
输入:nums = [3,3], target = 6输出:[0,1]
总结
- 使用哈希表可以将时间复杂度从 O(n²) 降低到 O(n)
- 关键思想是利用哈希表存储已经遍历过的元素,通过互补数快速查找
- 这种方法不仅适用于两数之和问题,也是解决类似问题的通用思路
