0.简介
记录LeetCode刷题过程,每篇分为四部分,题目描述、解题思路、参考代码、复杂度分析
如有疑问欢迎讨论
GitHub地址:https://github.com/LoneRanger0504/LeetCode
1.题目描述
给定一个整数数组 nums
和一个目标值 target
,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。
你可以假设每种输入只会对应一个答案。但是,你不能重复利用这个数组中同样的元素。
示例:
给定 nums = [2, 7, 11, 15], target = 9 因为 nums[0] + nums[1] = 2 + 7 = 9 所以返回 [0, 1]
2.解题思路
最暴力的O(N^2)的方法就不说了,主要的思路是用空间换时间,用HashMap来加快查找速度,代价就是增加了空间复杂度。
使用HashMap又可以有两种方式,一遍遍历和两遍遍历:
(1)一遍Hash:对当前的元素值num,计算出target与num的差difference,判断difference是否已经在HashMap中:如果已经存在,且num与difference的下标不一样,则返回对应的下标;如果不存在,将num作为key,index作为value存到HashMap中
(2)两遍Hash:先遍历一遍输入数组,依次添加到HashMap中,第二次遍历再依次判断对应下标,思路与依次遍历相同
python中HashMap对应的数据结构是字典dict
字典的相关操作如下:
初始化:dic = {}
添加key-value对: dic[key] = value
获取value: dic.get(key)
判断是否有某个key: if key in dic.keys()
3.参考代码
#一遍Hash
dic = {}
for index, num in enumerate(nums):
difference = target - num
if difference in dic.keys() and index != dic.get(difference):
return [dic.get(difference), index]
dic[num] = index
#两遍Hash
dic = {}
res = [0]*2
for index in range(len(nums)):
dic[nums[index]] = index
for i in range(len(nums)):
difference = target - nums[i]
if difference in dic.keys() and dic.get(difference) != i:
res[0] = i
res[1] = dic.get(difference)
return res
4.复杂度分析
最暴力的双层循环时间复杂度自然是O(N^2),空间复杂度O(1)
使用HashMap之后,时间复杂度分为两块,遍历数组为O(N),HashMap查找为O(1),故总体为O(N)
空间复杂度为O(N)
Table of Contents