题目描述
给定一个整数数组和一个目标值,找出数组中和为目标值的两个数。
你可以假设每个输入只对应一种答案,且同样的元素不能被重复利用。
示例:
给定 nums = [2, 7, 11, 15], target = 9 因为 nums[0] + nums[1] = 2 + 7 = 9 所以返回 [0, 1] 复制代码
分析
第一感觉是和我之前做过的题类似,就想先排序然后左右指针来夹逼,后面一想,排序之后数组下标就乱了,所以这个方法不行
考虑到可以使用一个map,存储的键值对为:target-val:index,也就是对于数组中的每一个数字,存下它和target的差距以及它的下标。
/** * @param {number[]} nums * @param {number} target * @return {number[]} */ var twoSum = function(nums, target) { if(nums === null || nums.length < 2) return []; var map = {}; for(var i = 0;i < nums.length;i++) { map[target-nums[i]] = i; } for(var i = 0;i < nums.length;i++) { var cur = nums[i]; if(map[cur] && map[cur] !== i) return [i, map[cur]]; } return []; };