给定一个整数数组 nums
和一个目标值 target
,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。
你可以假设每种输入只会对应一个答案。但是,数组中同一个元素不能使用两遍。
示例:
给定 nums = [2, 7, 11, 15], target = 9
因为 nums[0] + nums[1] = 2 + 7 = 9
所以返回 [0, 1]
【解】
1、直观解法:两层循环,时间复杂度O()。但是执行结果并不理想,只战胜了35%的提交记录,10ms以内有提交记录占了很大一部分,所以一定还有更优解。
执行结果分析:
2、题目给出的例子看起来是个有序数组,但是题目分析可知test case其实是无序的,也可能有重复数字,正负数等任意情况。更优解一定是优于O()的O()或者O(n)等等。由于数组无序,如果考虑先排序再计算,那么引入排序操作可能会让结果并没有太大提升,基本上排序就可能会消耗一个O()的时间。
有没有可能一次遍历以O(n)就找到结果?那么遍历过程中最好能以O(1)查找到之前遍历过的数字。能保存数据又能大概率以O(1)查找数据,考虑使用HashMap<nums[i], i>:遍历数组元素,对当前元素nums[i],如果target-nums[i]的值在map中存在,那么map中map.get(target-nums[i])和i的组合即为答案;如果不存在,将nums[i]为key,i为value继续put进map,向后遍历。
由于题干假设每种输入只会对应一个答案,所以默认数组中不会出现类似{2,2,3,5},target=7的case,那么target=4看起来也是可以覆盖的。
使用HashMap的结果如下: