两数之和(map记录值,并验证是否等于target-nums[i])

149 阅读2分钟

思路

  • 对于暴力法,需要遍历两遍数组的,都可以使用数组或者map存储想要找到的索引(题目要求)和其对应的值(题目需要使用值相加/相减做判断)

  • 对于数字相加等于某一个值(或者大于小于某一个值),即target,对于数组的每一个当前值,items[i],我们需要在数组中找到存在值targe - nums[i],我们可以判断map中是否存在 target - nums[i], 如果没有,我们把nums[i]的值和索引存入map.如果有就返回。

题目

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

你可以假设每种输入只会对应一个答案,并且你不能使用两次相同的元素。

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

示例 1:

示例 2:


Plain Text 输入:nums = [3,2,4], target = 6 输出:[1,2]

示例 3:


Plain Text 输入:nums = [3,3], target = 6 输出:[0,1]

提示:

  • 2 <= nums.length <= 104

  • -109 <= nums[i] <= 109

  • -109 <= target <= 109

  • 只会存在一个有效答案

**进阶:**你可以想出一个时间复杂度小于 O(n2) 的算法吗?

代码1

时间复杂度:O(N2),其中 N 是数组中的元素数量。最坏情况下数组中任意两个数都要被匹配一次。

空间复杂度:O(1)


JavaScript /**

-   @param {number[]} nums

-   @param {number} target

-   @return {number[]} */ var twoSum = function(nums, target) { let startIndex = 0; let endIndex = 0; let n = nums.length;

    for(let i = 0;i < n; ++i) { for(let j = i + 1;j<nums.length;j++) { if(nums[i] + nums[j] === target) { return [i,j] } } }

代码2

使用哈希表,可以将寻找 target - x 的时间复杂度降低到从 O(N) 降低到 O(1)

创建一个哈希表,对于每一个 x,我们首先查询哈希表中是否存在 target - x,然后将 x 插入到哈希表中,即可保证不会让 x 和自己匹配

时间复杂度:O(N),其中 N 是数组中的元素数量。对于每一个元素 x,我们可以 O(1) 地寻找 target - x

空间复杂度:O(N),其中 N 是数组中的元素数量。主要为哈希表的开销。


JavaScript /**

-   @param {number[]} nums

-   @param {number} target

-   @return {number[]} */ var twoSum = function(nums, target) { let startIndex = 0; let endIndex = 0; let n = nums.length; let map = new Map()

    for(let i = 0;i < n; ++i) { if(map.has((target - nums[i]))) { return new Array(map.get((target - nums[i])),i) } map.set(nums[i],i) } }; ```