如何找到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;
}
但是,这不是更好的选择(效率更高)吗?
答案 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]));