查找3个数字的最大总和,也可以除以3

时间:2017-11-15 18:07:33

标签: javascript arrays algorithm numbers

如何找到3个数字的最大总和,也可以除以3? 例子:
输入:[1,15,4,7,2]
输出:[15,7,2](按此顺序)

输入:[1,2,4,7]
输出:[1,4,7](按此顺序)

我只想到这个:

function largestSum(arr) {
    let max = -1;
    let nums;

    for (let i = 0; i < arr.length; i++)
        for (let j = i + 1; j < arr.length; j++)
            for (let k = j + 1; k < arr.length; k++)
                if ((arr[i] + arr[j] + arr[k]) % 3 === 0 && arr[i] + arr[j] + arr[k] > max)
                    nums = [arr[i], arr[j], arr[k]], max = arr[i] + arr[j] + arr[k];

    return nums;
}

但是,这不是更好的选择(效率更高)吗?

4 个答案:

答案 0 :(得分:1)

这可以使用模运算在线性时间和常数空间中求解,无需对输入进行排序或枚举其组合。

Save:
  the largest three elements congruent to 0 mod 3
  the largest three elements congruent to 1 mod 3
  the largest three elements congruent to 2 mod 3

Choose the largest of:
  1. the sum of the largest three elements congruent to 0 mod 3
  2. the sum of the largest three elements congruent to 1 mod 3
  3. the sum of the largest three elements congruent to 2 mod 3
  4. the sum of the largest element congruent to 0 mod 3
                and the largest element congruent to 1 mod 3
                and the largest element congruent to 2 mod 3

答案 1 :(得分:0)

如果您先按降序排序数字,然后找到第一个可被3整除的解,这将是最大的值。

在最糟糕的情况下,它比你的解决方案更糟糕,因为它完成了你所做的一切以及排序,但它最好是一种和一种测试。

它正在使用贪心算法。

答案 2 :(得分:0)

如果不尝试阵列的所有组合[你已经做过什么]

,就无法相信有办法做到这一点

答案 3 :(得分:0)

使用简单组合算法的另一个简单解决方案,并检查所需参数。

# mysql -u root < create_tables.sql
function getCombinations(array) {
    function add(a, b) { return a + b; }

    function fork(i, t) {
        var sum = t.reduce(add, 0);
        if (i === array.length) {                
            if (t.length === 3 && sum % 3 === 0 && sum > result.reduce(add, 0)) {
                result = t;
            }
            return;
        }
        fork(i + 1, t.concat([array[i]]));
        fork(i + 1, t);
    }

    var result = [];
    fork(0, []);
    return result;
}

console.log(getCombinations([1, 15, 4, 7, 2]));
console.log(getCombinations([1, 2, 4, 7]));