解法一
本解法的思路是看到题目后就能立刻想到的:遍历两遍数组,将数组中的值两两相加,找到和为指定值 target 的两个数字,返回它们在数组中的下标即可。
显然这个解法需要用到嵌套的两个 for
循环,代码如下:
var twoSum1 = function(nums, target){
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];
}
}
}
由于这个解法用到了嵌套的两个 for
循环,时间复杂度还是有点高的(虽然在 leetcode 上可以 Accepted)。
解法二
本解法是对于解法一的优化,思路很简单:空间换时间。
代码如下:
var twoSum2 = 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 ];
}
}
即新增一个数组 arr
充当哈希表的角色,该解法会遍历两遍 nums
数组,第一遍构造一个哈希表,第二遍在哈希表中进行查找。
解法三
本解法是对解法二的优化,只需要遍历 nums
数组一遍即可。
代码如下:
var twoSum3 = 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;
}
}
在遍历数组 nums
的时候会做两件事:其一是生成哈希表 arr
,其二是在之前生成的哈希表 arr
中进行查找。