1.1 题目描述
给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。
你可以假设每种输入只会对应一个答案。但是,数组中同一个元素不能使用两遍。
示例:
给定 nums = [2, 7, 11, 15], target = 9
因为 nums[0] + nums[1] = 2 + 7 = 9
所以返回 [0, 1]
1.2 常用方法
该题目首先想到的是两个for循环遍历,具体实现如下:
class Solution:
def twoSum(self, nums, target):
for i in range(len(nums)-1):
for j in range(i+1, len(nums)):
if nums[i]+nums[j] == target:
return [i, j]
return [-1, -1]
此时算法的时间复杂度是O(n^2),代码提交后的性能如下:
执行用时:5080 ms, 在所有 Python3 提交中击败了26.89%的用户
内存消耗:14.1 MB, 在所有 Python3 提交中击败了77.02%的用户
可以看出耗时是非常多的,特别是当两个数在列表后面的时候。因此,需要降低时间复杂度。
1.3 哈希表/字典方法
依次遍历列表中的元素,计算target和元素的差值temp,使用哈希表/字典来存储已经被遍历到但未匹配该差值temp的整数及其下标。当匹配时,返回下标列表,具体代码如下:
class Solution:
def twoSum(self, nums, target):
hash_dict = {}
for i in range(len(nums)):
temp = target - nums[i]
if temp in hash_dict.keys():
return [hash_dict[temp], i]
else:
hash_dict[nums[i]] = i
return [-1, -1]
此时算法的时间复杂度是O(n),代码提交后的性能如下:
执行用时:40 ms, 在所有 Python3 提交中击败了94.88%的用户
内存消耗:14.5 MB, 在所有 Python3 提交中击败了35.50%的用户
1.4 参考
[1] https://leetcode-cn.com/problems/two-sum/solution/dong-hua-tu-jie-suan-fa-liang-shu-zhi-he-fu-shi-pi/
[2] https://leetcode-cn.com/problems/two-sum/solution/leetcode-di-1-hao-wen-ti-liang-shu-zhi-he-by-miste/