此博客链接:https://www.cnblogs.com/ping2yingshi/p/14298291.html
可被三整除的最大和
题目链接:https://leetcode-cn.com/problems/greatest-sum-divisible-by-three/submissions/
题目
给你一个整数数组 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 整除的最大和)。
题解
先把数组排序,求数组的和,然后判断和是否能被三整除,如果能被三整除则直接返回,否则的话,把数组中除以3余2的数和除以三余1的数分开存储并且排序,当和除以3余2时,从除以3余2的数组中,找最小的余2的一个数,或者找最小的余1的两个数的和,从总和中减去数组元素除以3余2或者数组中除以3余1的两个数;当和除以3余1时,从除以3余1的数组中,找最小余1的数,或者从数组中找最小的余2的两个数,从总和中减去数组元素除以3余1的一个数或者除以3余2的两个数。
代码
注意:这里需要注意在判断余2和余1中,要判断余2和余1的列表长度,可能构不成余数相加。
class Solution { public int maxSumDivThree(int[] nums) { if(nums.length==1) if(nums[0]%3!=0) return 0; Arrays.sort(nums); int sum=0; int max=0; List <Integer> two=new ArrayList(); List <Integer> one=new ArrayList(); int result =0; for(int i=0;i<nums.length;i++) { sum+=nums[i]; if(nums[i]%3==2) { two.add(nums[i]); } if(nums[i]%3==1) { one.add(nums[i]); } } if(sum%3==0) return sum; if(sum%3==2) { if(one.size()>=2) { if(two.get(0)>one.get(0)+one.get(1)) { result=sum-one.get(0)-one.get(1); } else result=sum-two.get(0); } else{ if(two.size()>=1) result=sum-two.get(0); else return 0; } } if(sum%3==1) { if(two.size()>=2) { if(two.get(0)+two.get(1)>one.get(0)) { result=sum-one.get(0); } else result=sum-two.get(0)-two.get(1); } else{ if(one.size()>=1) result=sum-one.get(0); else return 0; } } return result; } }