可被三整除的最大和
难度:
标签:
题目描述
代码结果
运行时间: 41 ms, 内存: 20.4 MB
/*
* 题目思路:
* 使用Java Stream API可以简化操作,首先对数组进行分类,然后求出分类后的最小值和总和,根据总和的余数处理不同的情况。
*/
import java.util.Arrays;
public class MaxSumDivThreeStream {
public int maxSumDivThree(int[] nums) {
int sum = Arrays.stream(nums).sum();
int remainder = sum % 3;
if (remainder == 0) return sum;
int min1 = Arrays.stream(nums).filter(x -> x % 3 == remainder).min().orElse(Integer.MAX_VALUE);
int min2 = Arrays.stream(nums).filter(x -> x % 3 == 3 - remainder).min().orElse(Integer.MAX_VALUE);
if (remainder == 1) {
return Math.max(sum - min1, sum - min2 - min2);
} else {
return Math.max(sum - min2, sum - min1 - min1);
}
}
}
解释
方法:
题解的思路主要包括先计算数组所有元素的总和,然后根据总和除以3的余数来调整元素选择,以确保能够获得能被3整除的最大和。首先,计算数组总和s。如果s能够被3整除,直接返回s作为结果。否则,根据s除3的余数(1或2),我们需要调整元素以使总和能被3整除。为此,将数组分成两组,一组的元素除以3余1,另一组除以3余2。如果总和除以3的余数为1,我们尝试移除一个余数为1的最小元素或两个余数为2的最小元素组合。反之,如果余数为2,我们尝试移除一个余数为2的最小元素或两个余数为1的最小元素组合。最终返回调整后的最大总和。
时间复杂度:
O(n log n)
空间复杂度:
O(n)
代码细节讲解
🦆
题解中提到如果总和s除以3的余数为1,可以选择移除一个余数为1的元素或两个余数为2的元素。这种选择策略是否总是保证得到最大的可被三整除的和?
▷🦆
在处理余数为1和2的元素时,题解选择了排序这些元素。排序的目的是什么,有没有更高效的方法来找到最小的几个元素?
▷🦆
题解中如果数组中没有余数为1的元素时,设置答案为0。这种处理是否意味着在这个情况下无法获得非零的可被三整除的最大和?
▷🦆
题解中尝试移除元素的策略是基于直接移除最小值。在有多个相同的最小值时,移除哪个具体的元素是否会影响最终结果?
▷