两数之和
  问题描绘:
  给定一个整数数组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’);
  }
  }

posted on 2020-06-11 16:02  林口  阅读(662)  评论(0编辑  收藏  举报