1. 程式人生 > 實用技巧 >可被三整除的最大和

可被三整除的最大和

此部落格連結:https://www.cnblogs.com/ping2yingshi/p/14298291.html

可被三整除的最大和

題目連結:https://leetcode-cn.com/problems/greatest-sum-divisible-by-three/submissions/

題目

題解

先把陣列排序,求陣列的和,然後判斷和是否能被三整除,如果能被三整除則直接返回,否則的話,把陣列中除以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; } }

結果