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

1262. 可被三整除的最大和

提示

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

思路:

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

方法二:先整体求出所有数的和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]);
        }
    }




    }
};
相关推荐
倒头就睡的小比特5 天前
算法竞赛C++常用的STL
c++·算法
小羊没烦恼!5 天前
初探性能优化——2个月到4小时的性能提升
java·开发语言·windows·算法·c#
猎头南楼5 天前
知识社区推荐系统实践:新用户冷启动与长短期兴趣建模的挑战 资深推荐算法工程师
人工智能·深度学习·算法·机器学习
m0_547486665 天前
《数据结构教程》全套 PPT课件2026
数据结构
旖旎夜光5 天前
力控面试题 01.01: 判定字符是否唯一(位运算) —— 题解
c++·学习·算法·leetcode·力控
wzdark5 天前
大规模并行计算中的负载均衡算法研究4
算法
Because_of_Her15 天前
并查集-听课笔记
笔记·算法·并查集
码流子5 天前
高速公路安全监测实践:碰撞监测预警+物联网底座,从感知到处置的闭环
大数据·人工智能·物联网·算法·架构
another heaven5 天前
【算法/C++ MD5算法能否逆解码?原理、C++实现与同类哈希算法对比】
c++·算法·哈希算法
wzdark5 天前
从算法设计模式看编程思维的抽象能力4
算法