Two Sum 之javascript 解法

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Hreticent/article/details/86531550

给定一个整数数组 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 中进行查找。

扫描二维码关注公众号,回复: 5296249 查看本文章
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;
  }
}

猜你喜欢

转载自blog.csdn.net/Hreticent/article/details/86531550