JS如何计算两数之和

该文章介绍了如何利用哈希表(Map或Object)在O(n)的时间复杂度内解决找到数组中两个数相加等于目标值的问题。通过遍历数组,将每个数的差值作为键存储其下标,当遇到已存在的差值时,即可找到答案。这种方法优于双重循环的O(n²)解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目:给定一个整数数组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)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值