-
题目
给定一个整数数组,找到两个数字,使它们加起来成为一个特定的目标数字。
该函数
twoSum
应返回两个数字的索引,以使它们加起来等于目标,其中index1必须小于index2。请注意,您返回的答案(index1和index2)都是从零开始的。(您可以假设每个输入都只有一个解决方案)样例:
Example1: numbers=[2, 7, 11, 15], target=9 return [0, 1] Example2: numbers=[15, 2, 7, 11], target=9 return [1, 2]
-
分析
- 借助hashmap,存储映射:特定的目标数字target与整数数组numbers[i]之差 作为key,i 作为value
- 接着遍历整数数组,判断是否存在numbers[j]等于target-numbers[i],若存在,说明numbers[i]+numbers[j]==target,{i,j}即为所得。
- 若不存在,执行1;接着遍历整数数组。
-
题解
package lintcode;
import java.util.HashMap;
public class Solution_56 {
public int[] twoSum(int[] numbers, int target) {
HashMap<Integer,Integer> map = new HashMap<>();
for (int i = 0; i < numbers.length; i++) {
//get方法:获取指定键(key:numbers[i])所对应的值(value:i),不存在映射则为null
if (map.get(numbers[i]) != null) //有映射,即numbers[i++]==target - numbers[i]
{
int[] result = {map.get(numbers[i]), i};//{ 原来的i(就近取), 现在的i }
return result;
}
else
//put方法:将指定的键与值对应起来,并添加到集合中
map.put(target - numbers[i], i);//第一次:<key,value>,...hashmap可存储多组映射
}
//遍历完后没有符合的,则返回空值
int[] result = {};
return result;
}
public static void main(String[] args) {
//对象
Solution_56 solution = new Solution_56();
int numbers[]= {11,7,7,2,15};
int result[]=solution.twoSum(numbers,9);
System.out.print("[");
System.out.print(result[0]+","+result[1]);
System.out.print("]");
}
}
运行结果:
结果分析:
此段代码中用到的HashMap{key,value}的方法:
put(Object key,Object value):将映射Key-value添加进HashMap中。这里是put(target - numbers[i], i);也就是值和下标。
get(Object key):根据key获取指定的value。这里是get(numbers[i]);获取和值映射的下标。
参考链接:https://www.jiuzhang.com/solutions/two-sum/ ,https://blog.csdn.net/weixin_41434306/article/details/88582800