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

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Jet_closer

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值