题目
给定一个数组sums,以及一个目标target,假设数组中一定存在唯一一组数(两个)的和为target,输出这两个数的索引
解题思路:
1、该题目最容易想到的方法是对sums进行遍历,把所有可能的组数进行遍历(n2复杂度),在leetcode中超时错误。之后去掉之前遍历的重复计算,i从0到len(sums)遍历sums,j遍历索引从i到len(sums)的sums子序列(n2/2的复杂度),在leetcode中可以AC,但是对应的计算效率很低。
2、因为一定存在唯一一组数,可以对排序后的sums数组进行一次首尾遍历,对首尾相加,若超过target,则尾指针前移一个位置,若小于target,则首指针向后移动一个位置,则在首尾指针相接之前一定可以找到一对满足条件的索引。复杂度为O(nlogn),排序复杂度O(nlogn),检索复杂度O(n)。
3、利用python字典查询或C语言的map查询。即哈希算法,新建立一个数组,新数组的下表是原来数组的数值,新数组的值为原来数组的下标。对新数组的key进行遍历,遍历时看target-key是否存在于字典中,若存在则返回,输出这两个key的键值即可。复杂度O(n)。
解题代码:
O(n)
class Solution(object):
def twoSum(self, nums, target):
"""
:type nums: List[int]
:type target: int
:rtype: List[int]
"""
d = {}
size = 0
while size < len(nums):
if not nums[size] in d:
d[nums[size]] = size
if target - nums[size] in d:
if d[target-nums[size]] < size :
ans = [d[target - nums[size]] , size]
return ans
size = size + 1