题目介绍
解决方法
暴力破解
直接使用循环来进行解题
用python实现
class Solution(object):
def twoSum(self, nums, target):
"""
:type nums: List[int]
:type target: int
:rtype: List[int]
"""
for i in range(len(nums)):
for j in range(len(nums)):
if(nums[i]+nums[j]==target):
return [i,j]
优化
找出nums[i],创建一个新的数组储存nums前i各元素tump=nums[:i],再在tump中遍历寻找是否存在值为target-nums[i]的元素,如果存在将该元素的坐标赋值给j结束循环
最后返回 [j,i] 注意j在i前面
class Solution(object):
def twoSum(self, nums, target):
"""
:type nums: List[int]
:type target: int
:rtype: List[int]
"""
for i in range(len(nums)):
tump=nums[:i]
if((target-nums[i])in tump):
j=tump.index(target-nums[i])
break
return [j,i]
执行用时344ms
哈希表法
首先介绍:
enumerate() 函数用于将一个可遍历的数据对象(如列表、元组或字符串)组合为一个索引序列,同时列出数据和数据下标,一般用在 for 循环当中。
语法:
enumerate(sequence, [start=0])
sequence – 一个序列、迭代器或其他支持迭代对象。
start – 下标起始位置。
举例:
a=[1,2,3,4]
for i,a in enumerate(a):
print(i,a)#i表示数据下标,a返回列表数据
# 0 1
# 1 2
# 2 3
# 3 4
代码实现:
class Solution(object):
def twoSum(self, nums, target):
"""
:type nums: List[int]
:type target: int
:rtype: List[int]
"""
hashmap={}#创建一个空字典
for i,value in enumerate(nums):#遍历列表,value返回列表数据,i返回数据坐标
#查找hashmap字典中的key是否有target-value
if target-value in hashmap:
#如果存在返回target-value对应的值与 i
return [hashmap.get(target-value),i]
hashmap[value]=i#如果不存在,将 "value":"i" 添加到hashmap字典中
两遍哈希表
哈希表最大的优点,就是把数据的存储和查找消耗的时间大大降低,几乎可以看成是常数时间;而代价仅仅是消耗比较多的内存。然而在当前可利用内存越来越多的情况下,用空间换时间的做法是值得的。另外,编码比较容易也是它的特点之一。
在第一次迭代,将每个元素和其索引值添加到字典中。然后在第二次迭代中,检查每个元素对应的目标元素的索引值是否存在(hashmap.get(target-value)),但是目标元素的索引值不能是元素自身(hashmap.get(target-value)!=i)
#两次遍历哈希表
def twoSum4(nums,target):
hashmap={}
for i,value in enumerate(nums):
hashmap[value]=i
for i,value in enumerate(nums):
if (hashmap.get(target-value))and(hashmap.get(target-value)!=i):
return [i,hashmap.get(target-value)]