javascript - 如果数组的任何元素等于 n 或数组的两个元素之和等于 n,则返回 true - 提高性能

标签 javascript ecmascript-6

如标题所示,如果数组的任何元素等于 n 或数组的两个元素之和等于 n,我想返回 true。因此,如果数组是 [1,4,5] 并且 n 是 1 或 4 或 5 或 6 或 9 我想得到 true。这是我的代码:

function checkArray (x, array) {
  return array.includes(x) || array.some((item, i) => array.slice(i+1).includes(x-item)); 
}

它工作正常,但就性能而言,使用“some”是最好的方法吗?如何提高执行速度?

编辑:允许负数

最佳答案

除了分配/垃圾收集函数对象并为数组的每个元素旋转函数调用的正常性能开销之外,some 没有任何问题。

使用传统的 for 循环几乎总是最快的,但这通常是一种微观优化,只能用作最后的手段 - 从惯用的高级回调驱动进行重构for 循环的 JS 代码仅提供恒定因子加速。

在采取这种方法之前,我建议降低时间复杂度:Array#includes 是 O(n),Array#slice 也是如此。在嵌套循环中执行这些操作的时间复杂度为 O(n^2)。

您可以尝试经典的“空间与时间”权衡,并使用一个集合来存储您迄今为止看到的每个元素。如果n - currentElement === 集合中的某些内容,则您已找到总和为n 的两个数字。

const oneOrTwoElementsEqualN = (arr, n) => {
  const seen = new Set();
  return arr.some(e => {
    if (e === n || seen.has(n - e)) {
      return true;
    }
    
    seen.add(e);
  });
};

console.log(oneOrTwoElementsEqualN([1,2,3], 5));
console.log(oneOrTwoElementsEqualN([1,2,3], 2));
console.log(oneOrTwoElementsEqualN([1,2,3], 6));

请注意,这是 "two sum" 的一个轻微变体。问题。

关于javascript - 如果数组的任何元素等于 n 或数组的两个元素之和等于 n,则返回 true - 提高性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69036264/

相关文章:

javascript - 如何将一个javascript函数应用到asp.net中的多个文本框onfocus事件

javascript - 使用 webpack 和 babel-loader 的 ES6 模块导入导出

javascript - Flowtype:不安全的实例变量访问

javascript - 如何在图像映射/交换中的图像之间创建淡入淡出过渡。

javascript - 在 Immutable.js 的 Map 中按属性对子对象进行排序的正确方法是什么

javascript - 这种情况下 React useRef 和全局变量的区别

javascript - Babel.js 支持 ES6 Object.observer() 方法吗?

javascript - Node Keystonejs 意外 token 导出/导入

javascript - map 返回多组件

javascript - 如何根据路由更改父组件上的 header