algorithm icon indicating copy to clipboard operation
algorithm copied to clipboard

如何快速找出两个数之和等于某一个值的两个数?

Open JesseZhao1990 opened this issue 6 years ago • 3 comments

如何从一个数组中快速找出两个数之和等于某一个值的两个数?

穷举法

用for循环的嵌套,穷举,这种方法的时间复杂度为O(n^2),是最差的方法

快排+双指针

function pickNumOfSum(arr,sum){
  var i,j;
  var n = arr.length;
  for(i=0,j=n-1;i<j;){
    if(arr[i]+arr[j]===sum){
      return [i,j]
    }else if(arr[i]+arr[j]<sum){
      i++;
    }else{
      j--;
    }
  }
  return [-1,-1];

}


var a = [10,8,98,3,5,9,8,20];
a = a.sort(function(x,y){
  return x-y;
})

pickNumOfSum(a,108)

如果换成是找出三个数之和满足某一条件的值呢?


JesseZhao1990 avatar May 25 '18 08:05 JesseZhao1990

` var d = [10,8,98,3,5,9,8,20] var d_copy = [].contact(d)

d.forEach((t, k) => { const index = d_copy.indexOf(sum - t) if(index > -1 && index != k) { d_copy.splice(index, 1) d_copy.splice(k, 1) // number1 = t, number2 = sum - t } }) `

Kingsearch avatar Aug 10 '18 09:08 Kingsearch

const twoSum = function (nums, target) {
  const map = {}
  for (let i = 0; i < nums.length; i++) {
    if (map.hasOwnProperty(target - nums[i])) {
      return [i, map[target - nums[i]]]
    }
    map[nums[i]] = i
  }
}
twoSum([2, 7, 11, 15], 9)

lushdog avatar Mar 14 '19 11:03 lushdog

function getTwoNum(target, arr) {
  var map = {};
  for (let i = 0; i < arr.length; i++) {
    if (map[target - arr[i]] === undefined) {
      map[arr[i]] = i;
    } else {
      return [arr[map[target - arr[i]]], arr[i]];
    }
  }
  return [];
}

zzh3319 avatar Dec 31 '20 02:12 zzh3319