两数之和
问题描绘:
给定一个整数数组nums和一个目标值target,请你在该数组中找出和为目标值的那两个整数,并回来他们的数组下标。
你可以假定每种输入只会对应一个答案。但是,数组中同一个元素不能运用两遍。
示例:
给定nums=[2,7,11,15],target=9
由于nums[0]+nums[1]=2+7=9
所以回来[0,1]
代码:
packagealgorithm;
importjava.util.Arrays;
importjava.util.HashMap;
importjava.util.Map;
importjava.util.Scanner;
publicclassSolution{
//解法1:暴力法参考// from http://zzzjtd.com.html
publicint[]twoSum(int[]nums,inttarget){
inti,j;
intsum;
//外层循环遍历每一个元素
for(i=0;i<=nums.length;i++){
//内层循环遍历除i以外的值
//并判别是否存在一个值与nums[i]之和等于target
for(j=i+1;j<=nums.length;j++){
sum=nums[i]+nums[j];
if(sum==target){
returnnewint[]{i,j};
}
}
}
thrownewIllegalArgumentException(“Notwosumsolution”);
}
//解法2两遍哈希表
publicint[]twoSum_1(int[]nums,inttarget){
Mapmap=newHashMap<>();
//第一个循环,将数据元素的值和索引存到哈希表中
for(inti=0;i<nums.length;i++){
map.put(nums[i],i);
}
//第二个循环,遍历各元素与目标值target的差值,是否存在于哈希表中
//存在则输出该值与差值的索引值
for(inti=0;i<nums.length;i++){
intcomplement=target-nums[i];
if(map.containsKey(complement)&&map.get(complement)!=i){
returnnewint[]{i,map.get(complement)};
}
}
thrownewIllegalArgumentException(“Notwosumsolution”);
}
//解法3一遍哈希表
//在迭代并将元素刺进到哈希表中的同时,先校验哈希表中是否存在当时元素所对应的目标元素,如果有则直接回来
publicint[]twoSum_2(int[]nums,inttarget){
Mapmap=newHashMap<>();
for(inti=0;i<nums.length;i++){
intcomplement=target-nums[i];
if(map.containsKey(complement)){
returnnewint[]{i,map.get(complement)};
}
map.put(nums[i],i);
}
thrownewIllegalArgumentException(“Notwosumsolution”);
}
//main
publicstaticvoidmain(String[]args){
Solutionsolution=newSolution();
Scannerinput=newScanner(System.in);
System.out.println(“请输入数组长度:”);
intn=input.nextInt();
int[]nums=newint[n];
for(inti=0;i<n;i++){
System.out.println(“输入第”+i+”个数:”);
nums[i]=input.nextInt();
}
System.out.println(“请输入目标值:”);
intm=input.nextInt();
inttarget=m;
System.out.println(“目标值:”+target);
System.out.println(“整数数组nums=”+Arrays.toString(nums));
//计算一个方法执行时长,可用模板来写
longstartTime=System.currentTimeMillis();
//int[]twoSum=solution.twoSum(nums,target);
//int[]twoSum_1=solution.twoSum_1(nums,target);
int[]twoSum_2=solution.twoSum_2(nums,target);
longendTime=System.currentTimeMillis();
floatexcTime=(float)(endTime-startTime)/1000;
System.out.println(“结果=”+Arrays.toString(twoSum_2)+”,执行时间=”+excTime+’s’);
}
}