给定一个整数数组以及一个整数,从这个数组中找到俩个数,使得他们的和等于这个整数,最后返回这俩个数在数组中的索引
举个例子
array = [1,2,3,4];
sum = 7;
getIndexArr(array,sum);
// [2,3]
数组里面3和4的和刚好是7,所以返回他们在数组中的位置2和3
接下来来做一个简单的实现。
方法一:
function getIndexArr(array,target){
for (var i = 0; i < array.length; i++) {
for (var j = i + 1; j < array.length; j++) {
if (array[i] + array[j] === target) {
return [i,j]
}
}
}
}
分析上面这段代码,时间复杂度为O(n^2),随着数组长度的增加,这段代码的执行时间会变得比较长
方法二:
function getIndexArr(array,target){
var map = new Map();
for (var i=0;i < array.length; i++) {
map.set(array[i],i);
}
for (var j = 0;j < array.length; j++) {
if (map.has(target-array[j]) && map.get(target-array[j]) !== j) {
return [j,map.get(target-array[j])];
}
}
}
上面这段则把时间复杂度降到了O(n),包括遍历两次数组以及通过哈希表来查询key,但是需要额外申请一个map,其中的元素个数和数组的长度相关,空间复杂度变为O(n),算是以空间换时间了。
方法三:
function getIndexArr(array,target){
var map = new Map();
for (var i=0;i < array.length; i++) {
if (map.has(target-array[i]) && map.get(target-array[i]) !== i) {
return [i,map.get(target-array[i])];
}
map.set(array[i],i);
}
}
方法三的时间复杂度和空间复杂度和方法二一样,但是只遍历了一次数组,因为这里的逻辑是一边给map赋予元素,一边检查是否有符合条件的元素,时间上更快。