题目描述
给你一个整数数组 nums,请你找出并返回能被三整除的元素最大和。
题目核心:我们可以选取数组里面任意数字,求选出数字总和最大,并且总和可以整除 3。
思路分析
这里采用证难则反,这里采用贪心思路:

- 先把数组所有数字求和,得到总和
sum。 - 看总和对 3 取模的结果,分三种情况:
sum % 3 == 0:总和本身就满足条件,直接返回sum。sum % 3 == 1:总和多出来余数 1,有两种修正方案:- 删掉1 个模 3 余 1 的最小数字;
- 删掉2 个模 3 余 2 的最小数字 (两个余数 2 相加:
2+2=4,4%3=1,整体减掉余数 1); 两种方案取较大值。
sum % 3 == 2:总和多出来余数 2,同样两种修正方案:- 删掉2 个模 3 余 1 的最小数字 (
1+1=2,整体减掉余数 2); - 删掉1 个模 3 余 2 的最小数字; 两种方案取较大值。
- 删掉2 个模 3 余 1 的最小数字 (
怎么找出第一小和第二小的???

cpp
class Solution {
public:
int maxSumDivThree(vector<int>& nums) {
int n = nums.size();
int sum = 0;
int x1 = 10000, x2 = 10000, x3 = 10000, x4 = 10000;
for (int i = 0; i < n; i++) {
sum += nums[i];
if (nums[i] % 3 == 1) {
// x1 i x2
if (nums[i] >= x1 && nums[i] < x2)
x2 = nums[i];
else if (nums[i] < x1) {
x2 = x1;
x1 = nums[i];
} else
;
} else if (nums[i] % 3 == 2) {
if (nums[i] >= x3 && nums[i] < x4)
x4 = nums[i];
else if (nums[i] < x3) {
x4 = x3;
x3 = nums[i];
} else
;
} else
;
}
if (sum % 3 == 0)
return sum;
else if (sum % 3 == 1)
return max(sum - x1, sum - x3 - x4);
else
return max(sum - x1 - x2, sum - x3);
}
};