题目:给定一个整数数组 nums
和一个目标值 target
,请你在该数组中找出和为目标值的 两个 整数。
你可以假设每种输入只会对应一个答案。但是,你不能重复利用这个数组中同样的元素。
示例:给定 nums = [2, 7, 11, 15], target = 9 因为 nums[0] + nums[1] = 2 + 7 = 9 所以返回 [0, 1]
解析:
方法1:暴力法很简单。遍历数组中的每个元素 ,并查找是否存在一个值与 nums[x]+ nums[y]=target相等的目标元素。
/**
* @param {number[]} nums
* @param {number} target
* @return {number[]}
*/
var twoSum = function(nums, target) {
var result=[]; //声明一个空数组
for(var i=0;i<nums.length;i++){ //遍历数组
for(var j=i+1;j<nums.length;j++){
var sum=nums[i]+nums[j];
if(sum===target){ //判断两数之和是否与目标值相等
result.push(i,j);
return result;
}
}
}
};
twoSum([2, 7, 11, 15],9)
该方法的复杂度分析:
-
时间复杂度:O(n^2), 对于每个元素,我们试图通过遍历数组的其余部分来寻找它所对应的目标元素,这将耗费 O(n) 的时间。因此时间复杂度为 O(n^2)。
-
空间复杂度:O(1)。
方法2:使用查找表来解决该问题。
设置一个map容器record用来记录元素的值与索引
遍历数组nums
-
每次遍历时使用临时变量complement用来保存目标值与当前值的差值
-
在此次遍历中查找record,查看是否有与complement一致的值,如果查找成功则返回查找值的索引值与当前变量的值i
-
如果未找到,则在record保存该元素与索引值i
var twoSum = function(nums, target) {
var map = new Map();
var result=[];
for (var i = 0; i < nums.length; i++) {
map.set(nums[i], i); //遍历数组,将值放到map中
}
for (var j = 0; j < nums.length; j++) {
var complement = target - nums[j];
if (map.get(complement)&& map.get(complement) != j) { //判断map中是否有符合的值且下标值不重复
result.push(j,map.get(complement));
return result;
}
}
};
twoSum([1, 3, 4,2],6);
该方法的复杂度分析:
-
时间复杂度:O(n), 我们把包含有 nn 个元素的列表遍历两次。由于哈希表将查找时间缩短到 O(1),所以时间复杂度为 O(n)。
-
空间复杂度:O(n), 所需的额外空间取决于哈希表中存储的元素数量,该表中存储了 n 个元素。