如何减少0(n)以查找对特定值求和的对的第一个实例

艾丽·霍华德

我正在做一个代码战问题,说明如下:给定一个整数列表和一个总和值,按出现的顺序返回前两个值(请从左边解析),这些总和构成总和。

该解决方案可以工作,但是对于长数组来说太慢了,有人不使用两个for循环怎么办呢?我一直在尝试减少时间的复杂性,但是当我需要查看所有可能的组合时,我对如何实现这一点感到困惑。

function sumPairs(ints, s){
    var lowestIdx1 = Infinity;
    var lowestIdx2 = Infinity;

    for (var i = 0; i < ints.length-1; i++) {
        var cur = ints[i]
        for (var k = i+1; k < ints.length; k++) {
            var next = ints[k]
            if(cur + next === s){
                if(i <= lowestIdx1 && k <= lowestIdx1 || i <= lowestIdx2 && k <=lowestIdx2){
                    lowestIdx1 = i
                    lowestIdx2 = k
                }
            }
        }
    }
    if(lowestIdx1 !== Infinity){    
        return [ints[lowestIdx1], ints[lowestIdx2]]
    }
}

为了更清楚地说明问题,这里有一些示例输入输出:

sum_pairs([11, 3, 7, 5],         10)
#              ^--^      3 + 7 = 10
== [3, 7]

sum_pairs([4, 3, 2, 3, 4],         6)
#          ^-----^         4 + 2 = 6, indices: 0, 2 *
#             ^-----^      3 + 3 = 6, indices: 1, 3
#                ^-----^   2 + 4 = 6, indices: 2, 4
#  * entire pair is earlier, and therefore is the correct answer
== [4, 2]

sum_pairs([0, 0, -2, 3], 2)
#  there are no pairs of values that can be added to produce 2.
== undefined
妮娜·斯科茨(Nina Scholz)

您可以使用一些加速机制,例如

  • 单回路,
  • 访问值的哈希表
  • a元素变量array[i]

Codewars上的对和之长列表需要153 ms

var sum_pairs = function (array, s) {
    var a, i,
        hash = Object.create(null);

    for (i = 0; i < array.length; i++) {
        a = array[i];
        if (hash[s - a]) {
            return [s - a, a];
        }
        if (!hash[a]) {
            hash[a] = true;
        }
    }
};

console.log(sum_pairs([11, 3, 7, 5], 10));        // [3, 7]
console.log(sum_pairs([4, 3, 2, 3, 4], 6));       // [4, 2]
console.log(sum_pairs([0, 0, -2, 3], 2));         // undefined
console.log(sum_pairs([10, 5, 2, 3, 7, 5], 10));  // [3, 7]
console.log(sum_pairs([1, 2, 3, 4, 1, 0], 2));    // [1, 1]
console.log(sum_pairs([1, -2, 3, 0, -6, 1], -6)); // [0, -6]
console.log(sum_pairs([0, 2, 0], 0));             // [0, 0]
console.log(sum_pairs([5, 9, 13, -3], 10));       // [13, -3]
.as-console-wrapper { max-height: 100% !important; top: 0; }

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

查找特定值的第一个实例并添加ID,重复

如何使用 jQuery 获取在 data-* 中找到的特定值的第一个实例

在python中查找单词的第一个实例

如何根据第一个值对数组求和和分组

如何查找元素数组的第一个实例

如何使用JQuery查找element1或element2的第一个实例?

找到特定字符的第一个实例并使用 vba 获取左值

如何始终选择一个特定值的第一个SQL

如何获得分组值和重复值的所有“第一个”实例?

查找具有特定属性值的第一个节点

查找第一个元素的索引不等于特定值

查找包含特定年份的第一个日期

在一行中查找具有特定值的第一个和最后一个条目

查找与条件不同的第一个前提值

查找绘图线的第一个值

如何替换列表中的值的第一个实例

如何仅替换数据帧熊猫中最大值的第一个实例?

如何查找列中的第一个值大于该列中的前一个值

按ID对一列求和,但跳过第一个实例?

如果第一个小数点后的第一个值为0,如何忽略该值;如果大于0,如何忽略它?

如何获得价值的第一个实例?

使用jQuery查找元素的第一个动态类的每个第一个实例

如何在打字稿数组中查找第一个非null值?

如何使用 dplyr 在 R 中查找具有第一个值的列?

如何在SQL中上下查找第一个最接近的值?

如何查找和替换每行的第一个空值?

我如何找到特定成员具有特定值的第一个结构?

如何从一个int的第一个实例的行值中剥离所有内容?

从列表中的值中查找字符串中文本的第一个实例