【前端er每日一算法题】Leetcode 两数之和

70 阅读1分钟

题目

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

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

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

思路

题目限定了只有一组值,比较快的想法是先遍历一遍数组,以value为key,index作为值的map中,然后再遍历一遍数组,进行两数和的判断,因此得出解法1。

另外题目限定“数组中同一个元素在答案里不能重复出现”,所以需要判断当前的index和找到的元素的index不相等,否则不满足。

答案

解法1

/**
 * @param {number[]} nums
 * @param {number} target
 * @return {number[]}
 */
var twoSum = function(nums, target) {
    const map = {};
    for (let i = 0; i < nums.length; i++) {
        map[nums[i]] = i;
    }
    for (let i = 0; i < nums.length; i++) {
        const findKey = target - nums[i];
        // 数组中同一个元素在答案里不能重复出现,index不能相同
        if (map[findKey] && i !== map[findKey]) {
            return [i, map[findKey]]
        }
    }
    return [];
};

我以为就这么完了,结果看了下答案,发现有更好解法,答案里只需要一遍遍历就可以完成判断,所以优化解法:

var twoSum = function(nums, target) {
    const map = {}
    for (let i = 0; i < nums.length; i++) {
        const val = target - nums[i];
        // 注意0的判断
        if (map[val] !== undefined) {
            return [i, map[val]]
        }
        map[nums[i]] = i;
    }
    return []
};

思考

1、每次看答案,总会有更好的解法,我都没想到

2、题看似简单,但是很多细节问题,一般一遍写不过,所以多简单的题都需要自己码一遍。

3、继续加油⛽️!!