leetCode 两数之和

题目:给定一个整数数组 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去记录只能需找到一次符合要求的数。如何找到所有符合的组合,并且效率最高?

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值