题解的思路主要包括先计算数组所有元素的总和,然后根据总和除以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)
class Solution:
def maxSumDivThree(self, nums: List[int]) -> int:
s = sum(nums) # 计算数组所有元素的总和
if s % 3 == 0: # 如果总和可以被3整除,直接返回总和
return s
# 分别找出余数为1和2的元素列表
a1 = sorted(x for x in nums if x % 3 == 1)
a2 = sorted(x for x in nums if x % 3 == 2)
# 如果总和除以3的余数为2,则交换a1和a2
if s % 3 == 2:
a1, a2 = a2, a1
# 尝试移除一个余数为1的最小元素
ans = s - a1[0] if a1 else 0
# 尝试移除两个余数为2的最小元素,并取最大可能的和
if len(a2) > 1:
ans = max(ans, s - a2[0] - a2[1])
return ans