题目:给定一个整数数组 nums
和一个目标值 target
,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。
你可以假设每种输入只会对应一个答案。但是,你不能重复利用这个数组中同样的元素。
示例:
给定 nums = [2, 7, 11, 15], target = 9 因为 nums[0] + nums[1] = 2 + 7 = 9 所以返回 [0, 1]
读题:需要注意的地方是1、可以假设每种输入只会对应一个答案,意思是该题目里输入的数组中元素,任意两个元素之和符合结果的只有一个。
2、不能重复利用这个数组中同样的元素意思是:例如:nums[]={1,2,3,4,8} target=6
符合的不能是nums[3]+nums[3],就是相加时两个元素不一样。
最容易想到的思路:两次for循环寻找。时间复杂都是O(n^2)
利用数据结构,牺牲内存降低时间复杂度。如何循环一次,就找到答案?要循环一次,就得把循环时信息记录下来,记录到哪里?记录到的东西必须直接能够找到,不能通过二次循环。直接能够找到,通过索引是一种方法。循环一次,就是降低比较次数,如何降低比较次数?这个时候我们就需要发挥思路去想如何办到。通过例子进行说明 1+?=6,我循环也是要找到 “?”,题目就变成“?”该是谁,第一次比较告诉我们 1+2= 6 当"?"取2不合适。当前一个数是1的时候我们"?"需要取值是5,那么跟第一个数字结合的就是5,1+5=6,我们记录下,5,查看后面有没有5的就好(当有5的时候,我们还能找到现在记录的这个数),第一个就不需要比较了。这个时候比较第二个,发现第二个数字不是5,不符合第一个的要球,2+?=6,"?"取4比较合适,接下来寻找剩余的数里面有没有5或者4的。以此类推。这个时候我们就只要循环一遍就可以找到结果了。问题就变成了,我们拿什么数据结构来记录比较合适。留给读者自己去想。网上说用hashmap。其实用户hashmap只是增加内存,改变了查找方式,hashMap的containsKey方法,里面是采用的二分法查找,网上直接说这张算法的复杂度是O(n)其实不是的。因为hashMap的containsKey采用的是可分法查找方法,它的时间复杂度是O(logn).所以整体如果用hashMap存储的话,这种算法的时间复杂度应该是O(nLogn)
发散:本体如果用hashmap去记录只能需找到一次符合要求的数。如何找到所有符合的组合,并且效率最高?