给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。
你可以假设每种输入只会对应一个答案,并且你不能使用两次相同的元素。
你可以按任意顺序返回答案。
示例 1:
输入:nums = [2,7,11,15], target = 9
输出:[0,1]
解释:因为 nums[0] + nums[1] == 9 ,返回 [0, 1] 。
示例 2:
输入:nums = [3,2,4], target = 6
输出:[1,2]
示例 3:
输入:nums = [3,3], target = 6
输出:[0,1]
提示:
2 <= nums.length <= 104-109 <= nums[i] <= 109-109 <= target <= 109- 只会存在一个有效答案
进阶: 你可以想出一个时间复杂度小于 O(n2) 的算法吗?
解答:
先来一个我不动脑子的解答,用了2个for循环...
暴力双循环写法
python
class Solution:
def twoSum(self, nums: List[int], target: int) -> List[int]:
for x in nums:
for y in nums:
if x + y == target and x !=y:
print (x,y)
return [nums.index(x),nums.index(y)]
return
常规解答:
使用dict减少list的 in/index 的性能损耗
python
class Solution:
def twoSum(self, nums: List[int], target: int) -> List[int]:
seen = {} # 字典,键为数值,值为该数值在数组中的索引
for i, num in enumerate(nums):
result=target-num
if result in seen: # 检查 result 是否已经在字典中
return [seen[result], i] # 返回之前索引和当前索引
seen[num] = i # 将当前数值及其索引存入字典
return