力扣(可被三整除的最大和)

1262. 可被三整除的最大和

提示

给你一个整数数组 nums,请你找出并返回能被三整除的元素 最大和

思路:

方法一:利用一个长度为3的数组,分别保存0到i内余数为0,1,2的最大和,这样对于一个进入的数k,依次更新数组每一个元素,最后dp[0]就是所要求的结果.

方法二:先整体求出所有数的和sum,然后判断宿命对3的余数,如果是0,则直接返回。若是1,则结果可能是sum减去一个余数是1的元素,或者sum减去两个余数是二的元素。若是2,则结果可能是sum减去一个余数是2的元素,或者sum减去两个余数是一的元素。

class Solution {
public:
    int maxSumDivThree(vector<int>& nums) {
    //    vector<int>dp(3,0);
    //    //和余是0,1,2

    //    for(int i=0;i<nums.size();i++)
    //    {
    //       int ret=nums[i]%3;
    //       vector<int>dp1(dp.begin(),dp.end());
    //    //和余是0,1,2
    //       if(dp[ret]==0)
    //          {
    //             dp1[ret]=nums[i];
    //          }
    //       for(int k=0;k<3;k++)
    //       {
             
    //          {
    //             if(dp[k]!=0)
    //             {
    //                 //非零才能用来更新
    //                 dp1[(k+ret)%3]=max(dp[(k+ret)%3],dp[k]+nums[i]);
    //             }
    //          }
    //       }
    //         dp=dp1;
    //    }
    //    return dp[0];    

  const int cc=0x3f3f3f3f;
    vector<int>dp(3,cc);
     vector<int>dp1(3,cc);
         int sum=0;
    for(auto e:nums)
    {   
        sum+=e;
        int ret=e%3;
       if(dp[ret]>e)
       {
        dp1[ret]=dp[ret];
         dp[ret]=e;
         
       }
       else
       {
         dp1[ret]=min(dp1[ret],e);
       }
    }  

  

    if(sum%3==0)
    {
        return sum;
    }
    else if(sum%3==1)
    {
        if(dp[1]==cc&&dp1[2]==cc)
        {
            return 0;
        }
        else{
            return max(sum-dp[1],sum-dp[2]-dp1[2]);
        }
    }
    else
    {
         if(dp[2]==cc&&dp1[1]==cc)
        {
            return 0;
        }
        else{
            return max(sum-dp[2],sum-dp[1]-dp1[1]);
        }
    }




    }
};

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值