LeetCode菜鸟从零开始——第一题:两数之和
问题描述
给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。
你可以假设每种输入只会对应一个答案。但是,你不能重复利用这个数组中同样的元素。
给定 nums = [2, 7, 11, 15], target = 9
因为 nums[0] + nums[1] = 2 + 7 = 9
所以返回 [0, 1]
问题解答(python)
class Solution:
def twoSum(self, nums: List[int], target: int) -> List[int]:
used = {}
length = range(len(nums))
for i in length:
t = target - nums[i]
if t in used:
return[used[t],i]
used[nums[i]] = i
问题总结
在解这道题时,我遇到的问题(排除代码本身有问题卡在[2,7,11,15])主要就是[3,2,4]target = 6,在我外层用for遍历nums时,内层用if…in…判断目标是否在nums中,就会遇到在本次循环中nums[i] = 3,t = 6 - 3 = 3,而3也确实在nums里,但是答案[0,0]却不是正确答案(3被重复使用)。
class Solution:
def twoSum(self, nums: List[int], target: int) -> List[int]:
answer = []
i = 0
flag = 0
for i in range(len(nums)):
a = nums[i]
j = i+1
for j in range(len(nums)):
b = nums[j]
if a + b == target:
answer.append(i)
answer.append(j)
flag = 1
break
if flag == 1:
break
return answer
于是我改用双循环,但是时间复杂度太高,用时3332ms。
class Solution:
def twoSum(self, nums: List[int], target: int) -> List[int]:
length = len(nums)
for i in range(length):
t = target - nums[i]
for j in range(i+1,length):
if t == nums[j]:
return[i,j]
在参考了大手子的解题后,因为题中说你可以假设每种输入只会对应一个答案,为了避免重复使用,我决定使用Python中的字典功能,将使用过的数字存入字典,存入的数值作为key,数值在nums中的索引位置作为value,使用if…in…对字典进行查找可以大幅度提升查找效率,用时56ms。