1. 两数之和 JavaScript实现

86 阅读1分钟

两数之和

1、暴力法 -- 双层for循环

枚举数组中的每一个数 x,寻找数组中是否存在 target - x

/**
 * @param {number[]} nums
 * @param {number} target
 * @return {number[]}
 */
var twoSum = function(nums, target) {
    n = nums.length;
    
    // 遍历数组,判断target-nums[i]是否存在
    for(let i=0;i<n;i++){
        for(let j=i+1;j<n;j++){
            if (nums[i] + nums[j] === target){
                return [i,j];
            }
        }     
    }

};

二、哈希表

上面的算法主要耗时在于去查找target - x上面,时间复杂度为O(n)。所以改进的地方在于快速查找元素是否存在,并且在哪? 所以利用哈希表去查找元素,可以将查找元素的时间复杂度降低到O(1). 关于哈希表见 利用哈希表解此题的思想: 将每个元素都对应一个序号,构成key-value的形式,存在字典中。关键字key的值是元素,经过哈希表映射之后得到的位置是value的值。 当需要查找元素的时候,直接利用dict[key] = value 的形式就可以找到。

var twoSum = function(nums, target) {
    // 设置一个哈希表,用来存储数据,并且快速查看是否有目标值存在
    let m = new Map()

    for(let i=0; i<nums.length; i++){
        // 检查哈希表中是否存在对应的值
        let targetNum = target - nums[i]
        if(m.has(targetNum)){
            // 去这个值的下标
            let j = m.get(targetNum)
            return [i,j]
        }else{
            m.set(nums[i],i)
        }
    }
};