题目描述
整数数组中找出一组和为目标值的两个整数(不能重复利用这个数组中同样的元素),并返回他们的数组下标。
示例:
输入:[2, 7, 11, 15] 和 9
原因:nums[0] + nums[1] = 2 + 7 = 9
输出:[0, 1]
解析
考察重点:应用HashMap存储数据并快速检索,空间换取时间
实现方法:
很明显暴力法可以两次循环遍历,对数组中的每一个整数都去查找是否有匹配的结果,此时实际复杂度为O(n^2)。在这里我们应用HashMap存储已经遍历过的整数。当读取一个整数时去HashMap中查找是否有匹配的结果,如果存在返回结果,如果不存在将当前整数存入HashMap中,直到遍历完数组中全部整数为止。每次读取整数都会检查它之前读入的整数是否有匹配的结果,这样当遍历了全部数组整数之后,就会检查了所有可能的结果。使用HashMap存储记录是一种典型的用空间换取时间的做法,时间复杂度为O(n),空间复杂度为O(n)。
代码
public int[] twoSum(int[] nums, int target) {
Map<Integer, Integer> map = new HashMap<>();
for(int i = 0; i < nums.length; ++i){
Integer j;
if((j = map.get(target - nums[i])) != null){//如果存在匹配结果,返回
return new int[]{i,j};
}
map.put(nums[i], i);//放入HashMap中存储,继续遍历数组
}
return null;
}