题目:
给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。
你可以假设每种输入只会对应一个答案。但是,数组中同一个元素不能使用两遍。
示例:
给定 nums = [2, 7, 11, 15], target = 9
因为 nums[0] + nums[1] = 2 + 7 = 9 所以返回 [0, 1]
来源:力扣(LeetCode) 链接:leetcode-cn.com/problems/tw…
两数之和
解题思路1:暴力法
- for循环两次遍历,查找是否存在nums[i]+nums[j]==target,如果有,则返回[i,j];
/**
* @param {number[]} nums
* @param {number} target
* @return {number[]}
*/
var twoSum = function(nums, target) {
let len=nums.length,
indexArray=[];
for(let i=0;i<len;i++){
for(let j=i+1;j<len;j++){
if(nums[i]+nums[j]==target){
indexArray.push(i);
indexArray.push(j);
return indexArray;
}
}
}
};
复杂度分析:
-
时间复杂度:O(n^2) 对于每个元素,我们试图通过遍历数组的其余部分来寻找它所对应的目标元素,这将耗费 O(n)的时间。因此时间复杂度为 O(n^2)
-
空间复杂度:O(1)。
解题思路2:哈希表
- des=target-nums[i];for循环遍历每次目标值是否存在于哈希表中map.has(key);,使用map哈希表,记录是否匹配des的值;如果哈希表中存在des,则返回[i,map.get(key)];
/**
* @param {number[]} nums
* @param {number} target
* @return {number[]}
*/
var twoSum = function(nums, target) {
let map= new Map(),
len=nums.length;
for(let i=0;i<len;i++){
let des=target-nums[i];
if(map.has(des)){
return [map.get(des),i];
}else{
map.set(nums[i],i);
}
}
return [-1,-1]
};
复杂度分析:
-
时间复杂度:O(n), 我们只遍历了包含有 n 个元素的列表一次。在表中进行的每次查找只花费 O(1) 的时间。
-
空间复杂度:O(n), 所需的额外空间取决于哈希表中存储的元素数量,该表最多需要存储 n 个元素。