1.两数之和
题目描述:
给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。
你可以假设每种输入只会对应一个答案。但是,你不能重复利用这个数组中同样的元素
题解链接:两数之和
1.普通双重循环
这是第一感觉的解决办法,通过两次遍历,找出符合条件的答案。但是缺点很明显,用时过长,时间复杂度为O(n2).
代码实现:
def twoSum(nums,target):
for i in range(len(nums)):
for j in range(i+1,len(nums)):
if nums[i] + nums[j] == target:
return [i,j]
结果:
2.使用字典双重循环
通过评论中的思想,使用空间换时间。这里使用字典替换hashmap,首先先将列表的value和index作为一个字典的key和value。然后再次遍历列表,通过字典是否能找到对应的目标元素(target - nums[i])且不能是其本身。时间复杂度从O(n2)变为O(n).
代码实现:
def twoSum(nums, target):
d = {}
for i in range(len(nums)):
d[nums[i]] = i
for i in range(len(nums)):
other = target - nums[i]
if d.get(other) and d.get(other) != i:
return [i,d[other]]
结果:
3.一遍循环
改进使用字典的双重循环,在循环的同时,我们也去检查是否存在合理的答案。一旦存在那么直接返回。
代码实现:
def twoSum(nums, target):
d={}
for i,num in enumerate(nums):
if d.get(target - num) is not None:
return [i,d.get(target - num)]
d[num] = i
结果:
注:事实上当列表同时有两对符合条件的index时,只返回第一次发现的结果,并不考虑多解问题。