两数之和
难度:简单
给定一个整数数组 nums
和一个目标值 target
,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。
你可以假设每种输入只会对应一个答案。但是,数组中同一个元素不能使用两遍。
示例:
给定 nums = [2, 7, 11, 15], target = 9
因为 nums[0] + nums[1] = 2 + 7 = 9
所以返回 [0, 1]
解法一:双循环
class Solution:
def twoSum(self, nums: List[int], target: int) -> List[int]:
"""
:param nums: List[int]
:param target: int
:return: List[int]
"""
for index, value in enumerate(nums):
for count in range(index+1, len(nums)):
if value + nums[count] == target:
return [index, count]
return None
双循环是最普通的解法,第一次循环enumerate()
将可遍历的数据对象(本题中为nums
列表)组合为一个索引序列,同时列出数据与数据的索引。第二次循环从index+1
开始,即跳过自身开始下一个避免重复,若两数相加为target
的值,则以列表格式返回两数索引,若无合规的则返回None
。
解法二:缓存数值
class Solution:
def twoSum(self, nums: List[int], target: int) -> List[int]:
"""
:param nums: List[int]
:param target: int
:return: List[int]
"""
cache = {}
for index, value in enumerate(nums):
if target - value in cache:
return [cache[target - value], index]
cache[value] = index
return None
引入缓存机制,用容器cache
缓存已遍历的数值,在循环下个数值时,判断缓存容器中是否有符合的值,若缓存容器中存在与当前value
相加等于target
的值,则以列表格式返回两数索引,若无合规的则返回None
。
结果对比
解法 | 结果 | 运行时间 | 内存消耗 |
---|---|---|---|
解法一 | 通过 | 56ms | 15MB |
解法二 | 通过 | 5188ms | 14.5MB |
可以很明显看出,两种解法都能通过,内存消耗几乎没有差距,但运行时间相差极大,因为双循环遍历了所有元素组合,时间复杂度更大,容器缓存机制的引入极大提升了效率,推荐使用。