leetcode两数之和

121 阅读2分钟

题目描述

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

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

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

输入:nums = [2,7,11,15], target = 9 输出:[0,1] 解释:因为 nums[0] + nums[1] == 9 ,返回 [0, 1] 。

解题思路

1.分析需求我们需要找到某一个组合该组合相加的和为目标值。当我们对数组进行遍历时每个数的值以及该值的索引是固定的但是因为不知道后续数组存不存在匹配组合以及找到后如何记录当前值索引位置? 2. 这个题看到的第一瞬间我们可以瞬间想到循环嵌套循环对比计算任意两个值的组合并筛选出符合条件组合项的索引并返回。O(n^2) 3. 那么有没有时间复杂度更低的方法呢?我们假设nmus[n] + nums[n + 1] = 9;nums[n] = 9 - nums[n + 1]; 此时我问对nums[n]的索引做记录,并使其和nums[n + 1]形成关联关系。我们将nums[n]的索引值设为index[n]即record = {[nums[9 - nums[n + 1]]]: index[n]}; 如此当我们遍历数组的项时只要判断 record中index[n] 的值存在,即表明当前值nums[n + 1] 的索引index[n + 1] 与即recordnums[9 - nums[n + 1]]对应的记录即为目标组合的索引值;

题解

const nums = [2, 7, 11, 15];

const twoSum = (nums, target) => { const record = {}; const limit = nums.length; const result = []; for (let i = 0; i < limit; i++) { const item = nums[i]; const diff = target - item; const diffIndex = record[item]; if (diffIndex || diffIndex === 0) { result.push(diffIndex, i); break; } else { record[diff] = i; } } return result; };

console.log(twoSum(nums, 9));// [0,1]