第一题:两数之和 【leetcode】

程序员哆啦A梦

给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那两个整数,并返回他们的数组下标。你可以假设每种输入只会对应一个答案。但是,数组中同一个元素不能使用两遍。

示例:

给定 nums = [2, 7, 11, 15], target = 9
因为 nums[0] + nums[1] = 2 + 7 = 9
所以返回 [0, 1]

难度:简单

提示:
暴力解决方案,尝试遍历所有的数字对,双重循环遍历当前值和另一个当前值与目标值是否相等,如果相等返回结果。

利用空间换取时间,利用散列映射方式,解题思路将目标值target减去当前值curVal的差值存储在散列表中,继续执行如果当前值在散列表中返回结果。

答案:
方法一、暴力方法双重循环遍历

var twoSum = function(nums, target) {
    for (let i = 0, l = nums.length; i < l; i++) {
        for (let j = i + 1; j < l; j++) {
            if (nums[i] + nums[j] == target) {
                return [i, j];
            }
        }
    }
}
console.time('方法一');
twoSum([2, 7, 11, 15], 9);
console.timeEnd('方法一');

方法二、借助Object对象存储

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

console.time('方法二');
twoSum([2, 7, 11, 15], 9);
console.timeEnd('方法二');

方法三、借助Map对象存储

var twoSum = function(nums, target) {
    let targetMap = new Map();
    for (let i = 0; i < nums.length; i++) {
        if (targetMap.has(nums[i])) {
            return [targetMap.get(nums[i]), i];
        }
        targetMap.set(target - nums[i], i);
    }
};

console.time('方法三');
twoSum([2, 7, 11, 15], 9);
console.timeEnd('方法三');

方法四、借助Object使用while循环

var twoSum = function(nums, target) {
    let map = {};
    let loop = 0;
    let dis;
    while (loop < nums.length) {
        dis = target - nums[loop];
        if (map[dis] != undefined) {
            return [map[dis], loop];
        }
        map[nums[loop]] = loop;
        loop++;
    }
};
console.time('方法四');
twoSum([2, 7, 11, 15], 9);
console.timeEnd('方法四');