JavaScript两数之和

Posted 想上天的小鱼

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JavaScript两数之和相关的知识,希望对你有一定的参考价值。

题目

给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target  的那 两个 整数,并返回它们的数组下标。

你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。

你可以按任意顺序返回答案。

示例 1:
输入:nums = [2,7,11,15], target = 9
输出:[0,1]
解释:因为 nums[0] + nums[1] == 9 ,返回 [0, 1] 。

示例 2:
输入:nums = [3,2,4], target = 6
输出:[1,2]

示例 3:
输入:nums = [3,3], target = 6
输出:[0,1] 

提示:
2 <= nums.length <= 104
-109 <= nums[i] <= 109
-109 <= target <= 109
只会存在一个有效答案

好了,问题来了,我们需要做什么?
在目标数组中找出两个数字相加等于目标值,返回这两个数字在数组中对应的下标。

解决方案有哪些呢,让我们一起来瞅一瞅:

1、暴力枚举

先来看一个常规操作。

  • 时间复杂度 O(N*N)
  • 空间复杂度 O(1)
var twoSum = function(nums, target) {
    for (let i = 0; i < nums.length; i++) {
        // 因为两个数的下标不相等,所以 j=i+1
        for (let j = i + 1; j < nums.length; j++) {
            if (nums[i] + nums[j] === target && i !== j) {
                return [i, j];
            }
        }
    }
};

下面的解法是通过查找差值的下标,和上面的方法大同小异。
可以参考一下。
解法1:

var twoSum = function(nums, target) {
    for (let i = 0; i < nums.length; i++) {
        let num = target - nums[i];
        let j = nums.findIndex((item, index) => item === num && index !== i);
        if (j !== -1) {
            return [i, j];
        }
    }
};

解法2:

var twoSum = function(nums, target) {
    for (let i = 0; i < nums.length; i++) {
        let j = nums.indexOf( target - nums[i]);
        if (j !== -1 && i !== j) {
            return [i, j];
        }
    }
};

2、静态哈希

如果对Map的使用方法还不清楚的,可以去这里。

  • 时间复杂度 O(N)
  • 空间复杂度 O(N)
var twoSum = function(nums, target) {
    let map = new Map();
    for(let i = 0; i< nums.length; i++) {
        // 把数组里面的值都存成Map结构
        map.set(nums[i], i);
    }

    for(let i = 0; i< nums.length; i++) {
        // 获取差值
        let diff = target - nums[i];
        if (map.has(diff) && map.get(diff) !== i) {
            return [i, map.get(diff)];
        }
    }
};

3、动态哈希

和上面一种方法类似,不同点在于,只循环了一次。

  • 时间复杂度 O(N)
  • 空间复杂度 O(N)
var twoSum = function(nums, target) {
    let map = new Map();
    for(let i = 0; i < nums.length; i++) {
        const num1 = nums[i];
        const num2 = target - nums[i];
        // 判断map里是否存在num2,如果存在,返回下标;否则,把num1放进map里
        if (map.has(num2)) {
            return [map.get(num2), i];
        } else {
            map.set(num1, i);
        }
    }
};

这里解释一下,为什么返回的是[map.get(num2), i]?(知道的请自行跳过)
以nums=[2,7,8,9],target=9为例:

  1. i=0, num1=2, num2=7, map里没有num2 (即7), 所以把 (num1, i),也就是(2,0)放进map里
  2. i=1, num1=7, num2=2, map里有num2(即2),直接返回[0, 1]

看到这里应该就明白了,因为一开始的时候,map里的键值对还没有被放进去,所以后面map里面可以找到的时候,找到的是之前放进去的值,这个顺序也就没有疑问了。(这里也是因为当时我自己没有太明白,才多说了一嘴)

本次的分享先告一段落,如果有什么不正确或者更优的解决方案,欢迎大家评论区交流,一起进步呀!

以上是关于JavaScript两数之和的主要内容,如果未能解决你的问题,请参考以下文章

JavaScript两数之和

算法:JavaScript两数之和

Leetcode简单1. 两数之和JavaScript

01-两数之和

Leetcode 1. 两数之和(带图)

LeetCode 热题100 1.两数之和 解题思路 哈希表知识点回顾(JavaScript解题 5种方法)