思路
-
对于暴力法,需要遍历两遍数组的,都可以使用数组或者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) } }; ```