坚持不懈,越努力越幸运,大家一起学习鸭~~~
题目:
给你一个整数数组 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 整除的最大和)。
提示:
1 <= nums.length <= 4 * 10^4
1 <= nums[i] <= 10^4
思路:
- 计算数组的总和,如果能被3整除,则将和返回;
- 如果总和不能被3整除,先将数组从小到大排序。 如果余数是1,则删除数组中余数为1的最小的元素, 或者2个two的元素相加余数也是1,去除两个two的元素。 同理,如果余数是2,则删除数组中余数为2的最小的元素, 或者2个one的元素相加余数也是2,去除两个one的元素。
java代码:
class Solution {
public int maxSumDivThree(int[] nums) {
Arrays.sort(nums);
int sum = Arrays.stream(nums).sum();
int yu = sum % 3;
if (yu == 0) {
return sum;
}
List<Integer> one = new ArrayList<Integer>();
List<Integer> two = new ArrayList<Integer>();
for (int n : nums) {
if (n % 3 == 1) {
one.add(n);
} else if (n % 3 == 2) {
two.add(n);
}
}
int res = 0;
//如果余数是1, 则从one中去除一个, 或者2个two的元素相加余数也是1,去除两个two的元素
if (yu == 1) {
if (one.size() > 0) {
res = sum - one.get(0);
}
if (two.size() > 1) {
res = Math.max(res, sum - two.get(0) - two.get(1));
}
}
//如果余数是2, 则从two中去除一个, 或者2个one的元素相加余数也是2,去除两个one的元素
if (yu == 2) {
if (two.size() > 0) {
res = sum - two.get(0);
}
if (one.size() > 1) {
res = Math.max(res, sum - one.get(0) - one.get(1));
}
}
return res;
}
}