给定一个整数数组arr和一个整数target,请在数组中找出和为目标值target的那两个整数。
数组里面的值不会重复,返回值只有一种答案。
列举 输入 arr = [1, 2, 3, 4, 5] ,target = 9
输出[4, 5]
哈希表
let arr = [1, 2, 3, 4, 5]
let target = 9
let result = []
let map = {
}
arr.map(res => {
let complement = target - res
if (complement in map) {
result.push(complement, res)
}
map[res] = 1
})
console.log(result); //[4,5]
用 map 将数组中的所有元素存储起来。然后我们迭代数组中的每个元素,计算出 target 减去当前元素的差值 complement,判断该值是否在 map 中存在,如果存在,则将其作为元素添加到 result 数组中,同时将当前元素加入到 map 中。
时间复杂度为 O(n),最优解
双指针
let arr = [1, 2, 3, 4, 5]
let target = 9
let result = []
arr.sort((a, b) => a - b); // 首先将数组排序
let left = 0;
let right = arr.length - 1;
while (left < right) {
let sum = arr[left] + arr[right];
if (sum === target) {
// 如果当前两个指针位置的值之和等于target,则将其添加到结果数组中
result.push([arr[left], arr[right]]);
left++;
right--;
} else if (sum < target) {
left++;
} else {
right--;
}
}
console.log(result); //[4,5]
首先将数组排序,然后使用双指针从数组两端开始遍历,计算两个指针位置的值的和,并根据和与目标值是否相等和大小关系来移动指针。
复杂度为 O(nlogn),因为需要先对数组进行排序。但这个算法的空间复杂度为 O(1),所以在空间要求较高时是一个很好的选择。
两个for 循环
let arr = [1, 2, 3, 4, 5]
let target = 9
let result = []
for (let i = 0; i < arr.length; i++) {
for (let j = i + 1; j < arr.length; j++) {
if (arr[i] + arr[j] === target) {
result.push([arr[i], arr[j]]);
}
}
}
console.log(result); //[4,5]
使用两个 for 循环来遍历数组中的每个元素组合,计算它们的和,并判断是否等于目标值。
复杂度为 O(n^2),处理数据量较小的情况下可以使用,不推荐。