题目描述
给定整数的一个数组,找出这样的两个数,他们的加和等于一个特定的目标数字(target)。
twoSum函数应当返回两个数的索引,这两个数相加等于目标数字,其中index1必须小于index2。请注意,返回的结果(index1和index2)不是基于0的。
可以假设对于每一个输入来说,都只有一个解决方案。
输入实例
numbers = {2, 7, 11, 15}, target = 9
输出实例
index1 = 1 , index2 = 2
解析
- 通过暴力搜索,使用两个嵌套的循环来遍历所有的可能,时间复杂度为O(n*n),空间复杂度O(1);
- 利用哈希表,从左往右扫描一遍,然后将整数及其索引存到map中。然后在扫描一遍,对每一个整数K,搜索target-K在map中是否存在即可。如果存在,则输出K及target-K的下标。时间复杂度O(n),空间复杂度O(n);
暴力搜索法
Java代码如下所示:
import java.util.HashMap;
import java.util.Map;
public class twoSum {
public static int[] twoSum(int[] numbers, int target) {
int[] a = new int[2];//数组存放两个下标值
for (int i = 0; i < numbers.length - 1; i++){
for (int j = i + 1; j < numbers.length; j++ ){
if (numbers[i] + numbers[j] == target){
a[0] = i + 1;
a[1] = j + 1;
break;
}
}
}
return a;
}
public static void main(String[] args) {
int[] nums = {3,2,40,1,5};
int target = 6;
int[] result = new int[2];
result = twoSum(nums,target);
System.out.println("第一个索引值为:"+result[0] + " 第二个索引值为:"+ result[1]);
}
}
哈希方法
Java代码如下所示:
import java.util.HashMap;
import java.util.Map;
public class twoSum {
public static int[] twoSum(int[] nums, int target) {
int[] result = new int[2];
Map<Integer,Integer> map = new HashMap();
for(int i=0; i<nums.length; i++){
if(map.containsKey(target - nums[i])){
if(map.get(target - nums[i]) > i){
result[0] = i;
result[1] = map.get(target - nums[i]);
}else{
result[1] = i;
result[0] = map.get(target - nums[i]);
}
return result;
}
map.put(nums[i], i);
}
return result;
}
public static void main(String[] args) {
int[] nums = {3,2,40,1,5};
int target = 6;
int[] result = new int[2];
result = twoSum(nums,target);
System.out.println("第一个索引值为:"+result[0] + " 第二个索引值为:"+ result[1]);
}
}