LeetCode-两数之和
给一个整数数组,找到两个数使得他们的和等于 一个给定的数目标。
你需要实现的函数twoSum
需要返回这两个数的下标,并且第一个下标小于第二个下标。注意这里下标的范围是1到 n,不是以 0
开头。
样例:
给出numbers = [2, 7, 11, 15]
,target = 9
,返回 [1, 2]
。
两层for循环
public int[] sort(int num[],int target){
int i,j;
int result[]={0,0};
for (i = 0;i<num.length;i++){
for (j=1;j<num.length;j++) {
if (i > target || j > target)
continue;
if (num[i] + num[j] == target) {
result[0] = i;
result[1]=j;
}
}
}
return result;
}
这样的算法时间复杂度为O(n²)
我们知道对元素的搜索最快则是O(1)O(1),即直接索引到,联想只能是Hash表或者是关键字索引。关键字索引(从最小到最大)会占用额外的内存空间。
采用Hash表,建立索引
思路:1. num1 +num2 = target
2. num1 和num2 都是一个数组的数
也就是说,如果我们用target - num1 得到一个新数组,这个新数组中包含num2 则找到匹配值
实现:采用hash表 key为target-num1 ,value存放num1的数组下标。
public int[] sort(int num[],int target){
int [] i ={0,0};
Map <Integer,Integer> map = new HashMap<>();
for (int j=0;j<num.length;j++){
if(map.containsKey(num[j])){
i[0] = map.get(num[j]); //num1的下标
i[1] = j; // num2的下标
}
map.put(target - num[j],j);
}
return i;
}
时间复杂度为O(n)