题目
给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。
你可以假设每种输入只会对应一个答案。但是,数组中同一个元素不能使用两遍。
示例:
给定 nums = [2, 7, 11, 15], target = 9
因为 nums[0] + nums[1] = 2 + 7 = 9
所以返回 [0, 1]
解法一
解题思路:暴力解法,遍历nums数组每一个元素x,然后在x元素位置之后的所有元素中查找元素y(y=target-x),最后返回元素x和y的索引值。
代码如下:
class Solution:
def twoSum(self, nums: List[int], target: int) -> List[int]:
for x in range(len(nums)):
diff = target - nums[x]
for y in range(len(nums[x+1:])):
if diff == nums[x+y+1]:
return([x,x+y+1])
解法二
解题思路: 解法一中有两层for循环,计算复杂,执行时间过长。可以将第二层循环去掉,通过if判断语句,看元素y是否在数组中,结果为True则返回元素x和y的索引值。
代码如下:
class Solution:
def twoSum(self, nums: List[int], target: int) -> List[int]:
for x_index,x in enumerate(nums):
y = target - x
if y in nums: # 判断元素y是否在nums数组中
y_index = nums.index(y) # 结果为True则读取元素y的索引值
if x_index == y_index: # 数组中同一个元素不能使用两遍,若元素x和y的索引值相同,则跳过
continue
else:
return x_index,y_index # 否则返回索引值
break
else:
continue # 若元素y不在数组中则跳过进入下一次循环
解法三
解题思路:遍历nums数组元素,在元素x位置之后查找target-x值,首先判断target-x值是否在元素x之后有出现,若为True,则统计出现次数(用于控制循环)并返回索引值结果。
代码如下:
class Solution:
def twoSum(self, nums: List[int], target: int) -> List[int]:
for x_index,x in enumerate(nums):
diff = target - x
k = x_index+1
if nums[k:].count(diff) > 0: # 判断diff值是否在列表值x之后出现
for n in range(nums[k:].count(diff)): # 若判断为true,则统计出现次数,用于控制循环
y_index = nums.index(diff,k)
return([x_index,y_index])
解法四
解题思路:将数组转换成字典,首先创建一个空字典,遍历数组中的元素x,如果target-x值在字典中,则返回x和target-x的索引值,否则将元素x作为key,其索引值作为value存入字典中。另外,如果先存入字典再查找target-x值,当x和target-x的值相同时,结果返回同一个索引值。
代码如下:
class Solution:
def twoSum(self, nums: List[int], target: int) -> List[int]:
d = {} # 创建一个空字典
for x_index,x in enumerate(nums):
if target - x in d: # 查找target-x值是否在字典中
return d[target-x],x_index
else:
d[x] = x_index # 数组元素为字典的key,其索引值为字典的value
另外
以上四种解法并不完美和最优,在一组数组中可能有多组两数之和等于target值,也可能同一数字出现多次(索引值不同)。
若有不足或更好解法,后续补充。