JesseZhao1990/algorithm

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

JesseZhao1990 opened this issue · 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)

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


`
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
}
})
`

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)
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 [];
}