题目描述
解题思路
先说一种很容易想到的暴力解法
暴力解法的思路很简单,就是遍历数组,对于每一个元素,都去遍历数组中剩下的元素,判断是否有两个元素的和等于目标值,如果有,就返回这两个元素的下标。
python">class Solution(object):def twoSum(self, nums, target):for i in range(len(nums)):rest = nums[i+1:]for j in range(len(rest)):if nums[i] + rest[j] == target:return [i, i+j+1]
尝试提交,通过,时间复杂度为O(n^2)
。
显然上面的方法不够优雅,再说一种优雅的解法
暴力解法是把每一个数都遍历,然后返回下标,但是这个遍历的过程显然是太过于耗时了,那么我们能不能使用一个数据结构把已经遍历过的数据存储起来,然后往后遍历的时候,求和的时候直接去除先前数据的下标呢?
有的,有的兄弟!我们可以使用字典来存储,当然,你也可以叫他哈希表(HashMap
),其实在Python
中,这就是字典,为什么叫他哈希表呢,这是因为这个存储思想就是基于操作系统中哈希存储的。
那么我们可以这样来操作:我们遍历所有的数据,以数据的值为键,以它的下标为值,存储到哈希表中,然后每次都判断目标的值和当前所遍历的值的差是否在哈希表中,如果在,直接返回当前数的下标和哈希表中数的下标,否则继续。
开始手搓!
python">class Solution(object):def twoSum(self, nums, target):num_dict = {}for i in range(len(nums)):if target - nums[i] in num_dict.keys():return [i, num_dict[target-nums[i]]]else:num_dict[nums[i]] = i
尝试提交,通过,时间复杂度为O(n)
。
总结
可以看到,执行时间从2172ms降到了3ms,效率提升了700倍!自然就变得优雅了。