JS如何计算两数之和

题目:给定一个整数数组nums,和一个目标值target,请在nums数组中找到两个数字相加等于target,输出这两个整数的下标。

思路:

使用map(当然对象也可,但是性能相比map稍差些),循环nums,将当前循环下标a作为value,将目标值target减去当前循环项得到的值b作为key,储存到map中。问题在于对于b的理解,b其实就是我们要在nums中寻找的值,因为这个差值b加上刚才的循环项c即等于我们的目标值target,一旦找到这个差值,也就是我们要找的这个差值b所在的下标,另外就是当前循环项d。时间复杂度:O(n),空间复杂度:O(n)

const sum = function (nums, target) {
    const map = new Map();
    for (let index = 0, len = nums.length; index <= len - 1; index++) {
        if (map.has(nums[index])) {
            return [map.get(nums[index]), index];
        } else {
            map.set(target - nums[index], index);
        }
    }
}

const count = sum([ 1, 1, 22, 2, 1, 8, 2, 2, 9, 12, ], 30); // [2, 5]

使用对象处理

const sum2 = function (nums, target) {
    const obj = {};
    for (let index = 0, len = nums.length; index <= len - 1; index++) {
        const key = target - nums[index];
        const diff = nums[index];
        if (obj.hasOwnProperty(diff)) {
            return [obj[diff], index];
        } else {
            obj[key] = index;
        }
    }
}

当然,如果嵌套两层循环也是可以实现这个需求的,但是时间复杂度:O(n²),空间复杂度:O(n)

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值