题目描述
给出一个整数数组,请在数组中找出两个加起来等于目标值的数,你给出的函数twoSum 需要返回这两个数字的下标(index1,index2),需要满足index1 小于index2.。注意:下标是从1开始的
假设给出的数组中只存在唯一解
例如:给出的数组为 {20, 70, 110, 150},目标值为90输出 index1=1, index2=2
题解一
简单粗暴,双层循环相加进行比较。这是最容易想到的方法,枚举数组中的每一个数 x,寻找数组中是否存在 target - x
import java.util.*;
public class Solution {
/**
*
* @param numbers int整型一维数组
* @param target int整型
* @return int整型一维数组
*/
public int[] twoSum (int[] numbers, int target) {
// write code here
int [] result = new int[2];
for (int i = 0; i < numbers.length ;i++){
if(numbers[i] > target) continue;
for(int j = 0; j < numbers.length ; j++){
if(numbers[i] + numbers[j] == target && i < j){
result[0] = i + 1;
result[1] = j + 1;
return result;
}
}
}
return result;
}
}
复杂度分析
时间复杂度:O(N^2)其中 N 是数组中的元素数量。最坏情况下数组中任意两个数都要被匹配一次。
空间复杂度:O(1)。
题解二
借用map进行处理
题解一的时间复杂度较高的原因是寻找 target - x 的时间复杂度过高。因此,我们需要一种方法,能够快速寻找数组中是否存在目标元素。如果存在,我们需要找出它的索引。使用哈希表,可以将寻找 target - x 的时间复杂度降低到从 O(N) 降低到 O(1)。
public static int[] twoSum (int[] numbers, int target) {
int [] result = new int[2];
Map<Integer, Integer> map = new HashMap<>();
for (int i = 0; i < numbers.length ;i++){
if(map.get(target - numbers[i]) != null){
result[0] = map.get(target - numbers[i]) + 1;
result[1] = i + 1;
return result;
}
map.put(numbers[i],i);
}
return result;
}
题目链接:
两数之和