1.题目描述:
给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。
你可以假设每种输入只会对应一个答案。但是,你不能重复利用这个数组中同样的元素。
示例1:
给定 nums = [2, 7, 11, 15], target = 9
因为 nums[0] + nums[1] = 2 + 7 = 9
所以返回 [0, 1]
2.分析
首先想到的必定是暴力解法,遍历这个列表,两遍,找到想要的解,再进行去重。时间复杂度O(n2),结果就是时间超时。
接着你就要想到利用字典这个python自带的hash表,来利用空间换时间。构造一个以(target-nums[i])
为键,索引i
为值的字典,接着遍历整个列表,两个终止条件:1.
num[x]
在我们所构造的字典中,意思就是有某一个索引对应的值加num[x]
会等于target
。因为字典是一个hash表,所以这个时间复杂度是O(1)。因为经过一遍遍历构造字典,时间复杂度为O(n);遍历查找值时间复杂度为O(n);总和该算法时间复杂度为O(n),空间复杂度为O(n),战果为:
执行用时 : 28 ms, 在Two Sum的Python提交中击败了98.36% 的用户
内存消耗 : 12.7 MB, 在Two Sum的Python提交中击败了0.96% 的用户
3.解决
class Solution:
def twoSum(self, nums, target):
"""
:type nums: List[int]
:type target: int
:rtype: List[int]
"""
n = len(nums)
d = {}
for x in range(n):
a = target - nums[x]
d[a] = x # 创建一个字典,值为该项需要的目标值,并且保存了该项的索引
for x in range(n): # 对每一项进行匹配,看是否有匹配的目标值
if nums[x] in d and d[nums[x]] != x: # 要保证不是同一项
return d[nums[x]],x