提示:以下是本篇文章正文内容,下面案例可供参考
一、题目分析
题目:给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。
你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。
你可以按任意顺序返回答案。
题目链接:求两数之和
题目分析:需要从数组nums获取两个元素,它们的和为目标值target,最容易让我们想到的就是暴力枚举遍历数组的方法,但是时间复杂度较大,于是我们也可以采用哈希表的方法,接下来主要介绍这两个方法。
二、求解
1.方法一:暴力枚举
思路及算法
最简单的想法就是,遍历数组每一个数X,找的另一个数Y满足条件:
X + Y = target
得到X和Y的下标并返回
代码:
class Solution:
def twoSum(self, nums: List[int], target: int) -> List[int]:
n = len(nums) # 获取数组长度
for X in range(n-1): # 遍历每一个数X
for Y in range(X+1, n): # 遍历每一个数Y
if nums[X] + nums[Y] == target: # 是否满足X + Y = target
return [X, Y] # 返回对应索引
return [] # 没有符合条件的元素,返回空
时间复杂度:O(N2)
空间复杂度:O(1)
考虑这种算法需要两次遍历数组,时间复杂度较高,主要原因是查找Y时间较长,可以考虑采用其他查找算法代替枚举,接下来介绍采用哈希表的方法进行解题。
2.方法二:哈希表
思路及算法:
我们已经知道方法一时间消耗长的主要原因,就是在查找Y时消耗时间较长,时间复杂度为O(N),采用哈希表查找可以将时间复杂度降低为O(1)
我们创建一个哈希表,对于每一个X,先在哈希表中查找target - X是否存在,再插入X,即可防止X与自己匹配,哈希表的key为数组中的值,value为对应索引
class Solution:
def twoSum(self, nums: List[int], target: int) -> List[int]:
hashtable = dict() # 创建哈希表
for i, X in enumerate(nums):
if target - X in hashtable: # 判断target
return [hashtable[target - X], i] # 返回索引
hashtable[nums[i]] = i # 哈希表不存在target - X,将X的索引值插入哈希表
return [] # 没有符合条件的元素,返回为空
时间复杂度:O(N)
空间复杂度:O(N) 主要为哈希表的开销