如何在数组中找到三个等于其总和等于目标和的元素?

时间:2018-09-28 08:36:38

标签: javascript arrays

我可以通过三个循环来做到这一点,但是复杂度将是O(n3),可以用更少的复杂度来做到吗?

为三种循环方法添加js小提琴代码

var arr = [1, 2, 3, 4, 5, 6, 7, 8];
var sum = 8;
find(arr, sum);

function find(arr, sum) {
  var found = false;
  for (var x = 0; x < arr.length - 3; x++) {
    for (var y = x + 1; y < arr.length - 2; y++) {
      for (var z = y + 1; z < arr.length; z++) {
        if (arr[x] + arr[y] + arr[z] == sum) {
          found = true;
          break;
        }
      }
    }
  }
  if (found) {
    console.log("found");
  } else {
    console.log("not found");
  }
}

1 个答案:

答案 0 :(得分:2)

您可以使用哈希表,一个用于数组,一个用于两个项的和。

function find(array, sum) {
    var hash = Object.create(null);
    return array.some((v, i, a) => {
        a.slice(0, i).forEach(w => hash[v + w] = true);
        return hash[sum - v];
    });
}

console.log(find([1, 2, 3, 4, 5, 6, 7, 8], 8));
console.log(find([1, 2, 3, 4, 5, 6, 7, 8], 42));

如果您希望通过对两个值之和的Set进行闭包来使其更具功能,那么这也将起作用。

function find(array, sum) {
    return array.some(
        (s => (v, i, a) => a.slice(0, i).reduce((t, w) => t.add(v + w), s).has(sum - v))
        (new Set)
    );
}

console.log(find([1, 2, 3, 4, 5, 6, 7, 8], 8));
console.log(find([1, 2, 3, 4, 5, 6, 7, 8], 42));