给定一个整数数组 nums
和一个目标值 target
,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。
你可以假设每种输入只会对应一个答案。但是,你不能重复利用这个数组中同样的元素。
示例:
给定 nums = [2, 7, 11, 15], target = 9
因为 nums[0] + nums[1] = 2 + 7 = 9
所以返回 [0, 1]
PS:Python index() 方法检测字符串中是否包含子字符串 str ,如果指定 beg(开始) 和 end(结束) 范围,则检查是否包含在指定范围内,该方法与 python find()方法一样,只不过如果str不在 string中会报一个异常。
index()方法语法: str.index(str, beg=0, end=len(string))
1.可以对数组中的每一个元素进行遍历,用目标值减去遍历的元素值,得出的值与数组中的数进行比较。
class Solution(object):
def twoSum(self, nums, target):
"""
:type nums: List[int]
:type target: int
:rtype: List[int]
"""
for i in range(len(nums)):
x = target - nums[i]
if x in nums:
j = nums.index(x)
if j != i:
return i,j
时间复杂度:O(n2),空间复杂度:O(1) ( 因为python中list对象的存储结构采用的是线性表,因此其查询复杂度为O(n)。
那么if x in nums的时间复杂度就是O(n) )
2.暴力解法,遍历列表中的每一个值,然后再遍历不包括上一个值的每一个值,如果这两个值的和为目标值,返回。
class Solution(object):
def twoSum(self, nums, target):
"""
:type nums: List[int]
:type target: int
:rtype: List[int]
"""
n = len(nums)
for x in range(n):
for y in range(x+1,n):
if nums[y] == target - nums[x]:
return x,y
时间复杂度:O(n2)、空间复杂度:O(1)
3.还有一种字典的方法,时间复杂度:O(1) 、空间复杂度O(n) (python中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]进行对比