本人是第一次做leedcode上面的题目,有分析的不严谨的地方,请大家指正
下面是这一题的题目描述:
1。我们能够自然而然地想到的思路就是每次从nums这个数组中选择出两个数,再求和与target进行比较,所以在n个数中选取出2个,一共有
C
n
2
C_{n}^{2}
Cn2种取法,也就是n(n-1)/2种,所以总的时间复杂度是O(n^2)。在此关于这个的算法就不展示了,较为容易。
2。第二种方法:我们可以从这个角度来考虑:
在我们遍历到nums数组的第i个元素的时候,这个数组的前 i - 1 个元素我们都是知道的,所以就可以不用在遍历一遍去寻找了,而是存储在另一个地方(也就是需要额外的空间去存储,时间上面优化往往需要牺牲一定的空间)
那么由于我们是求解两数之和,所以我们很自然的想到两个数与target/2的差值是互为相反数的。所以我们可以利用这个差值作为特征构建一个字典,字典的键是差值的绝对值,字典的键中存放了一个list,里面有两个元素,一个是当前的索引i,另一个是这个差值(不要绝对值)(键我为什么要设置成差值的绝对值呢,因为方便差值相同的数能够定位到同一个字典项)。
所以当出现相同的差值的数的时候,要么这个数是和原来的数完全相同,要么就是符合题目条件的那一个数,所以我们进行一次比较就可以了。
整体上算法优化的就是寻找相同的差值的数,原先的暴力算法是从数组的第一个数开始搜索,而我们这里是使用dict字典的哈希查找,哈希查找是很快的,为O(1),所以这是两个算法时间复杂度不同的根本原因。
下面贴出我的代码,可能有一些地方不太规范,多多包涵啦~
class Solution(object):
def twoSum(self, nums, target):
target = target / 2
dict1 = dict()
for i in range(len(nums)):
a = dict1.get(abs(nums[i] - target))
if a is None:
dict1[abs(nums[i] - target)] = [i, nums[i] - target] # 这里用一个数组存储下标和差值
else:
if a[1] + nums[i] - target == 0:
return [a[0], i]