原题:
给一个整数数组,找到两个数使得他们的和等于一个给定的数target
需要实现的函数需要返回这两个数的下标,并且第一个下标小于第二个下标(下标的范围是1到n,不是以0开头)
样例:
给出numbers=[2, 7, 11, 15],target=9, 返回[1, 2]
方法一:
思路:
1. 利用双层循环历遍数组,找出符合条件的数
2. 将其下标+1后(因为数组下标从0开始)按顺序存入新建数组中,将数组返回
public class Solution {
public int[] twoSum(int[]numbers,int target){
int sum[]=new int[2];
for(int i=0;i<numbers.length;i++){
for(int j=i+1;j<numbers.length;j++){
if(target-numbers[i]==numbers[j]){
sum[0]=i+1;
sum[1]=j+1;
}
}
}
return sum;
}
}
方法二:
思路:
1. 存入对应的下标:
(1)用一个键值对的集合HashMap,以数组中元素与target差值为key,对应数组元素的下标作为value并用HashSet来存储
(2)用for循环历遍数组,对求出的差值做判断:
A. HashMap中若有对应值的key,则将当前数组元素的下标存入HashMap中(因为考虑到数组元素值重复的问题,所以会下标不同,但是求出的差值相同)
B. 若无,则创建集合HashSet并存入当前数组元素的下标,然后将差值与HashSet分别作为key与value存入HashMap中
(3)这样,若数组中有元素a与HashMap的key相等,就能满足数组中两数之和为target的值,此时a的下标与对应key的value就是所求
2. 取出需要的下标:
(1)创建一个新数组来保存要返回的下标
(2)在for循环中,若当前数组元素与HashMap中的一个key相等:
A. 用get方法返回此key的value的集合,并用迭代器依次取出这个key的value(也就是下标)赋值给index(第一次调用iterator的next()方法时,会返回集合中的第一个元素)
B. 然后两个下标做比较,因为数组下标的唯一性,所以避免返回是的是同一个数组元素的下标。
比如:target为8, 数组中元素与target的差值为4, 也就是8 - 4 = 4; 若两个数组元素值为4, 那么对应的两个下标都会被存入以4为key的HashMapt中,并且不能保证先后顺序,所以iterator可能会取出for循环中当前数组元素的下标,也就需要做判断
C. 根据题目要求,对符合条件的下标进行排序与增值,存入数组
(3)返回数组
public class Solution {
public int[] twoSum(int[]numbers,int target){
HashMap<Integer,HashSet<Integer>> numToIndexes=new HashMap<Integer, HashSet<Integer>>();
for(int i=0;i<numbers.length;i++){
int diff=target-numbers[i];
if(numToIndexes.containsKey(diff))
numToIndexes.get(diff).add(i);
else{
HashSet<Integer> set=new HashSet<Integer>();
set.add(i);
numToIndexes.put(diff,set);
}
}
int[] ans=new int[2];
for(int i=0;i<numbers.length;i++){
if(numToIndexes.containsKey(numbers[i])){
int index=numToIndexes.get(numbers[i]).iterator().next();
if(index!=i){
ans[0]=Math.min(i,index)+1;
ans[1]=Math.max(i,index)+1;
break;
}
}
}
return ans;
}
}