题目
给定一个整数数组 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、继续加油⛽️!!