给定一个整数数组
nums
和一个目标值target
,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。你可以假设每种输入只会对应一个答案。但是,你不能重复利用这个数组中同样的元素。
示例:
给定 nums = [2, 7, 11, 15], target = 9 因为 nums[0] + nums[1] = 2 + 7 = 9 所以返回 [0, 1]
方法一:
最直观的反映就是嵌套for循环:遍历两遍数组,将数组中的值两两相加,找到和为指定值 target 的两个数字,返回它们在数组中的下标即可。
var twoSum = function(nums,target) {
//首先判断nums是否是数组、taget的值是否是数值
if(!Array.isArray(nums) || Object.prototype.toString.call(target) !== "[object Number]"){
return;
};
//再判断两数之和
var i,j,len = nums.length;
for(i=0;i<len;i++){
for(j=i+1;j<len;j++){
if(nums[i]+nums[j]===target){
return[i,j];
}else{
return false;
}
}
}
};
twoSum([2, 7, 11, 15],9);//[0,1]
Object.prototype.toString.call()方法:参考
Array.isArray()方法:参考
方法二:
优化之处:空间换时间,即新增一个数组 arr
充当哈希表的角色,该解法会遍历两遍 nums
数组,第一遍构造一个哈希表,第二遍在哈希表中进行查找。
var twoSum = function(nums, target){
if ( !Array.isArray(nums) || Object.prototype.toString.call(target) !== "[object Number]" ) return;
var arr = [],
i,
j,
len = nums.length;
for ( i = 0; i < len; i ++ ){
arr[nums[i]] = i;
}
for ( i = 0; i < len; i ++ ){
j = arr[ target - nums[i] ];
if ( j !== undefined && i !== j ) return [ i, j ];
}
}
方法三:
只需要遍历 nums
数组一遍,在遍历数组 nums
的时候会做两件事:其一是生成哈希表 arr
,其二是在之前生成的哈希表 arr
中进行查找。
var twoSum = function(nums, target){
if ( !Array.isArray(nums) || Object.prototype.toString.call(target) !== "[object Number]" ) return;
var arr = [],
i,
j,
len = nums.length;
for ( i = 0; i < len; i ++ ){
j = arr[ target - nums[i] ];
if ( j !== undefined ) return [ j, i ];
arr[nums[i]] = i;
}
}