题目:
给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。
你可以假设每种输入只会对应一个答案。但是,数组中同一个元素不能使用两遍。
示例:
给定 nums = [2, 7, 11, 15], target = 9
因为 nums[0] + nums[1] = 2 + 7 = 9
所以返回 [0, 1]
基于python3
方法1:利用Python序列求解,插值法
算法分析:利用target-nums[i],在nums里寻找是否有目标值,有的话输出i与j的值
class Solution:
def twoSum(self, nums: List[int], target: int) -> List[int]:
k = len(nums)
j=-1
for i in range(k):
if (target-nums[i]) in nums:
if(nums.count(target-nums[i]) == 1)&(target-nums[i]==nums[i]):#检验是不是同一个numb且只出现一次
continue
else:
j=nums.index(target-nums[i],i+1,k)
break
if j>0 :
return[i,j]
else:
print("未找到")
S.index()的用法:第一位为寻找目标,第二位为起始位,第三位为结束位
另一种简洁的差值写法:
class Solution:
def twoSum(self, nums, target):
"""
:type nums: List[int]
:type target: int
:rtype: List[int]
"""
n = len(nums)
for x in range(n):
b = target-nums[x]
if b in nums:
y = nums.index(b)
if y!=x:
return x,y
方法2
算法:基于方法1,但不再进行遍历数组,而是在nums(i)的前面找j
class Solution:
def twoSum(self, nums: List[int], target: int) -> List[int]:
l = len(nums)
j = -1
for i in range(1,l):
s = nums[:i]
if(target - nums[i]) in s:
j = nums.index(target - nums[i])
return[j,i]
方法3(最好的做法,利用字典)
算法:利用字典
class Solution:
def twoSum(self, nums: List[int], target: int) -> List[int]:
cache = dict()#建立一个空字典用于存储
for i, num in enumerate(nums):#enumerate用于遍历nums
if num in cache:
return [cache.get(num), i]
else:
cache[target-num] = i
另一种写法:感觉这个更直观一点:
此法是算差值,并将差值及其序号存入字典中,第一轮遍历存入字典,d[7]=0,第二轮a=2,nums[1]=7,nums[1]存在于字典中,d[nums[x]]=0,x=1.
时间复杂度:O(1) 、空间复杂度O(n) (补充:dict对象的存储结构采用的是散列表(hash表),其在最优情况下查询复杂度为O(1))
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中存在nums[x]时
if nums[x] in d:
return d[nums[x]],x
#否则往字典增加键/值对
else:
d[a] = x
#边往字典增加键/值对,边与nums[x]进行对比
方法4 暴力解法
思路:这个很简单,一直遍历,算就行,但是比较慢
class Solution:
def twoSum(self, nums: List[int], target: int) -> List[int]:
l = len(nums)
for i in range(l):
for j in range(i,l):
if nums[i] + nums[j] == target:
return[i,j]