两数之和
题目描述
给出一个整数数组,请在数组中找出两个加起来等于目标值的数:
你给出的函数twoSum 需要返回这两个数字的下标(index1,index2),需要满足 index1 小于index2.。注意:下标是从1开始的
假设给出的数组中只存在唯一解
例如:
给出的数组为 {20, 70, 110, 150},目标值为90
输出 index1=1, index2=2
示例:
输入:[3,2,4],6
返回值:[2,3]
题解思路
1.暴力解法
希望遍历数组找到数组中的两个数
需要使用两层for循环来遍历数组,第一层for循环相当于选取一个数;第二层for循环是用来判断(目标值target-第一层选取的那个数)是否存在于数组nums中;如果存在就输出两个点的下标,如果不存在就换另一个点进行查找。
完整代码
class Solution:
def twoSum(self , numbers , target ):
# write code here
res = [] # 返回结果
# 遍历每个数
for i in range(len(numbers)):
# 在数组中找target-number[i]
temp = target - number[i]
for j in range(i+1,len(numbers)):
# 找到了返回结果
if temp == number[j]:
res.append(i+1)
res.append(j+1)
return res
# 没找到,退出循环,返回空值
return res
2.O(n)
定义一个空字典,遍历数组,当sec(=目标值target-当前数numbers[i])不存在于字典中时,将当前数字numbers[i]存入字典中,对应的值是其坐标;直到sec=target-numbers[i]在字典中时,输出sec=target-numbers[i]在字典中的值和当前索引。
因为题目描述要求下标是从1开始,所以,返回值中的索引要+1
完整代码
class Solution2:
def twoSum(self , numbers , target ):
# write code here
# 定义空字典
dict = {}
n = len(numbers)
# 遍历数组
for i in range(n):
# 目标值减去遍历数组当前元素的值sec
sec = target - numbers[i]
# 判断sec是否存在于字典中,如果不存在则将当前值写入字典中,下标为i
if sec not in dict:
dict[numbers[i]] = i
else: # 存在,则证明找到了相加和为目标值的两个数,返回字典中数值和当前索引
return [dict[sec]+1,i+1]
# 循环结束,没有找到值,则返回空数组
return []