给你一个整数数组 nums,请你找出并返回能被三整除的元素 最大和。
示例 1:
输入:nums = [3,6,5,1,8]
输出:18
解释:选出数字 3, 6, 1 和 8,它们的和是 18(可被 3 整除的最大和)。示例 2:
输入:nums = [4]
输出:0
解释:4 不能被 3 整除,所以无法选出数字,返回 0。
示例 3:
输入:nums = [1,2,3,4,4]
输出:12
解释:选出数字 1, 3, 4 以及 4,它们的和是 12(可被 3 整除的最大和)。
var maxSumDivThree = function(nums) {
//按照%3分别余0,余1,余2创建3个数组
let mod = [[], [], []];
let sum = 0;
for (let i = 0; i < nums.length; i++) {
mod[nums[i] % 3].push(nums[i]);
sum = sum + nums[i]
}
//余数
let more = sum % 3;
if (more == 0) return sum;
//要减去的值
let remove = Infinity;
mod[1] = mod[1].sort((a, b) => a - b);
mod[2] = mod[2].sort((a, b) => a - b);
//余1或余2可以减去一个符合的最小的
if (mod[more].length > 0) {
remove = mod[more][0]
}
//余1可以减去两个余2的值,或者余2减去两个余1的值
let remain = more == 1 ? 2 : 1;
if (mod[remain].length > 1) {
remove = Math.min(remove, mod[remain][0] + mod[remain][1])
}
return remove == Infinity ? 0 : sum - remove
};