JS代码实现一个数组里面任意两个数相加等于另一数

数组里面任意两个数相加等于另一数

给定一个整数数组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),处理数据量较小的情况下可以使用,不推荐。

猜你喜欢

转载自blog.csdn.net/Jet_Lover/article/details/129784421