Two Sum 的 javascript 解法

解法一

本解法的思路是看到题目后就能立刻想到的:遍历两遍数组,将数组中的值两两相加,找到和为指定值 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 中进行查找。

    原文作者:虽万万人吾往矣
    原文地址: https://www.jianshu.com/p/b3be87df03a2
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞