leetcode 1.两数之和
题目描述:
给定一个整数数组 nums 和一个整数目标值 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]
题解
Method-1
看到这个题目的第一想法就是直接暴力求解,x是数组中存在的一个值,设置两个坐标循环两次,本质上求解target-x是否存在。
def twoSum(self, nums, target):
n = len(nums)
for i in range(n):
for j in range(i+1, n):
if nums[i]+nums[j] == target:
return [i,j]
然后发现这样做的话时间复杂度达到了o(n^2),因此寻找另外一种最优解。
Method-2
这道问题的本质还是求解 target-x,那么我们直接就可以利用哈希表的方法求解。在哈希表中,我们只需要找 x 对应的 target-x是否在哈希表中即可,然后将x插入到哈希表中即可。
def twoSum(self, nums, target):
hasharray = dict()
for i,num in enumerate(nums):
if target - num in hasharray:# 如果当前 target - num 的值在哈希表中,这直接返回其索引和值。
return [hasharray[target -num], i]
else:
hasharray[nums[i]] = i #插入 i的键值对
此时的时间复杂度为O(n)。