首页 > 解决方案 > 数组中的差/和,以检查生成的两个数字是否导致另一个数组

问题描述

为了清楚起见,这就是我的意思。我想在将生成特定数字的数组(已排序)中查找最小的两个数字。步骤如下:

Example. I need two numbers that when subtracted from the array will give a result of 2. 
let givenArray = [1, 4, 8, 10];
The subtraction should go thus: 4 - 1 = 3(doesn't match); //continue
                                8 - 4 = 1(doesn't match);// continue
                                8 - 1 = 7(doesn't match); //continue
                                10 - 8 = 2(match found); //stop and return 8, 10.

注意:这个相同的数组可能包含 6 和 8 或 8 和 10,它们都将产生 2,但应该返回 6 和 8。生成数组的方式并不重要。

PS:我昨天最终解决了它,但我不介意关于如何去做的其他想法

标签: javascriptarrays

解决方案


此解决方案利用哈希表并使用单循环方法从数组中获取两个值以平衡两个值。

首先,取两个值的绝对增量,arrayA并将其用于从更大的数组中取出值。

arrayB然后通过检查所需值是否存在以及总和是否小于先前找到的集合来减少更大的数组。

delta检查的参数是根据和的绝对增量、v数组的实际值或取和的delta和来构建的v

最后一点,为了使这一切正常工作,实际值v包含在哈希表中,以供以后查找。

结果要么是两个值的数组,它们平衡其他两个值,要么是undefined,如果没有找到值。

var arrayA = [3, 5],
    arrayB = [2, 9, 5, 4],
    delta = Math.abs(arrayA[0] - arrayA[1]),
    values = {},
    result = arrayB.reduce((r, v) => {
        function check(w) {
            if (!values[w] || r && r[0] + r[1] < v + w) return;
            r = [w, v];
        }
        check(Math.abs(delta - v));
        check(delta + v);
        values[v] = true;
        return r;
    }, undefined);

console.log(result);


推荐阅读