两数之和
问题描述
题目描述
给出一个整数数组,请在数组中找出两个加起来等于目标值的数,
你给出的函数twoSum 需要返回这两个数字的下标(index1,index2),需要满足 index1 小于index2.。注意:下标是从1开始的
假设给出的数组中只存在唯一解
例如:
给出的数组为 {20, 70, 110, 150},目标值为90
输出 index1=1, index2=2输入
[3,2,4],6
返回值
[2,3]
解题思路
有两种解法:
第一种就是使用两重for循环暴力匹配。复杂度为n的平方。
第二种就是使用map记录下对应元素的下标,再去匹配,匹配成功,获得下标即可。
但是可以做出优化,不需要完全将所有元素都存入map中,而是需要的时候再存。找到答案返回即可。最差时的效率,就是将所有元素及下标提前放入map中。
Java代码
解法一:
import java.util.*;
public class Solution {
/**
*
* @param numbers int整型一维数组
* @param target int整型
* @return int整型一维数组
*/
public int[] twoSum (int[] numbers, int target) {
HashMap<Integer,Integer> map = new HashMap<>();
for(int i=0;i<numbers.length;i++){
map.put(numbers[i],i);
}
int [] res = new int [2];
for(int i=0;i<numbers.length;i++){
if(map.containsKey(target-numbers[i]) && map.get(target-numbers[i])!=i){
res[0] = i+1;
res[1] = map.get(target-numbers[i])+1;
break;
}
}
return res;
}
}
解法二:
import java.util.*;
public class Solution {
/**
*
* @param numbers int整型一维数组
* @param target int整型
* @return int整型一维数组
*/
public int[] twoSum (int[] numbers, int target) {
HashMap<Integer,Integer> map = new HashMap<>();
// for(int i=0;i<numbers.length;i++){
// map.put(numbers[i],i);
// }
int [] res = new int [2];
for(int i=0;i<numbers.length;i++){
int tmp = target-numbers[i];
if(map.containsKey(tmp) && map.get(tmp)!=i){
res[0] = map.get(target-numbers[i])+1;
res[1] = i+1;
break;
}else{
map.put(numbers[i],i);
}
}
return res;
}
}