题目描述
给出一个整型数组 numbers
和一个目标值 target
,请在数组中找出两个加起来等于目标值的数的下标,返回的下标按升序排列。
(注:返回的数组下标从1开始算起,保证target一定可以由数组里面2个数字相加得到)
要求:空间复杂度 O(n),时间复杂度 O(nlogn)
方法一:直接遍历(超时的解法)
Js代码:
/**
*
* @param numbers int整型一维数组
* @param target int整型
* @return int整型一维数组
*/
function twoSum(numbers, target) {
for (var i = 0; i < numbers.length - 1; i++) {
for (var j = i + 1; j < numbers.length; j++) {
if (numbers[i] + numbers[j] == target) {
return [i + 1, j + 1];
}
}
}
}
复杂度分析
- 时间复杂度:O(n^2)遍历两次数组
- 空间复杂度:O(1)未申请额外空间
方法二:哈希表(本题AC的解法)
具体做法
使用Map来降低时间复杂度,遍历数组,如果哈希表中没有(target - 当前值)就将当前数字存入哈希表,如果有,返回该数字下标即可。
哈希表可以优化第二遍循环中对元素的检索速度。
Js代码:
/**
*
* @param numbers int整型一维数组
* @param target int整型
* @return int整型一维数组
*/
function twoSum(numbers, target) {
const myMap = new Map();
for (var i = 0; i < numbers.length; i++) {
if (!myMap.has(target - numbers[i])) {
myMap.set(numbers[i], i);
} else {
return [myMap.get(target - numbers[i]) + 1, i + 1];
}
}
}
复杂度分析
- 时间复杂度:O(n)一次遍历hash索引查找时间复杂度为O(1)
- 空间复杂度:O(n)申请了n大小的map空间