每日一个小算法之两数之和
给定一个整数数组nums和一个目标值target,请你在该数组中找出和为目标值的那两个整数,并返回他们的数组下标。
本文出自凯哥Java(kaigejava)
你可以假设每种输入只会对应一个答案。但是,你不能重复利用这个数组中同样的元素。
示例:
给定nums=[2,7,11,15],target=9
因为nums[0]+nums[1]=2+7=9
所以返回[0,1].
这个题目是不是很简单啊。
首先,我们想到的第一种方案就是for循环。嵌套循环。如下:
JAVA代码:
publicstaticvoidmain(String[]args){Integer[]nums=newInteger[]{1,2,0,5,7,9,3};Integertarget=5;Integer[]returnNums=twoSum(nums,target);System.out.println(JSON.toJSONString(returnNums));}publicstaticInteger[]twoSum(Integer[]nums,Integertarget){Integer[]returnNums=newInteger[2];for(inti=0;inums.length;i++){for(intj=i+1;jnums.length;j++){intnum1=nums;intnum2=nums[j];if((num1+num2)==target){returnNums[0]=i;returnNums[1]=j;returnreturnNums;}}}returnreturnNums;}
运行结果:
执行结果是出来了。我们看看执行时间:
是不是很low的一种方法。
那么接下来,我们看看第二中算法:
第二种算法和巧妙。Java代码如下:
privateInteger[]twoSum2(Integer[]nums,Integertarget){Integer[]indexs=newInteger[2];//建立k-v,一一对应的哈希表HashMapInteger,Integerhash=newHashMapInteger,Integer();for(inti=0;inums.length;i++){if(hash.containsKey(nums)){indexs[0]=i;indexs[1]=hash.get(nums);log.info(JSON.toJSONString(hash));returnindexs;}//将数据存入key为补数,value为下标hash.put(target-nums,i);log.info(==:{},i=:{},target-nums:{},nums,i,target-nums);}returnindexs;}
其中巧妙的地方:
再来看看运行结果:
看看两个算法对比:
再速度上是不是快了很多。
欢迎大家留下更好的算法。一起学习,一起成长