今天的一道算法题

今天做了一道算法题,要求是从数组中找到最先能够相加等于结果的两个值,如果有多个,则选择最先的两个。例子


buy(2,[1,1])       = [0,1]
buy(3,[1,1])       = null
buy(5,[5,2,3,4,5]) = [1,2]
buy(5,[1,2,3,4,5]) = [0,3] // the values at [1,2] also adds up to five, but [0,3] < [1,2]

以下是我的答案,缺点是不能在最开始得到结果时跳出循环。


var buy = function(x, arr){
  var gift = [];
  for( var i = 0;i<arr.length;i++){
    arr.slice(i+1).map(function(val,key,subarr){
      if(arr[i]+val == x && gift.length == 0){
        gift.push(i);
        gift.push(i+key+1);
      };
    })
  }
  if(gift.length ==2) return gift;
  return null;
};

以下是目前的最优解


var buy = function(sum, arr){
  var result = null;
  
  arr.some(function(item, i) {
    var id = arr.indexOf(sum - item, i + 1);
    if (id !== -1) {
      result = [i, id];
      return true;
    }
  });
  
  return result;
};

这个解法的优点有: 1.使用了some,some在return true时会结束循环 2.使用了indexOf,避免了显示的二次循环。

比我的for + map高明多了。

Written on June 18, 2015