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

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

  • 哈希表
  • 双指针
  • 两个for 循环

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

你可能感兴趣的:(笔记,javascript,算法,数据结构,前端,开发语言)