可被三整除的最大和

简介: 【5月更文挑战第5天】可被三整除的最大和

可被三整除的最大和

给你一个整数数组 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余数和总和除以3余数相同)
那这样就可以分三种情况:

  1. 总和余数为0,那么就意味着所有数相加就能满足条件,所以我们就不需要再减去任何数了。
  2. 总和余数为1,那么就意味着我们需要减去一部分(这部分除以3余数也是1),并且要求这部分最小化,那么我们可以明显的感觉到排完序之后更好找一些,就是从小到大取。减去这部分要求余数为1,又有两种情况
    1. 只减去一个余数为1的数
    2. 减去两个余数为2的数
  3. 总和余数为2,与总和余数为1的相似,只不过两种情况为:
    1. 只减去一个余数为2的数
    2. 减去两个余数为3的数
      所以余数是0(整除3)的数不用管,因为它只会影响结果的大小,不会影响结果的余数。
class Solution {
   
public:
    int maxSumDivThree(vector<int>& nums) {
   
        sort(nums.begin(),nums.end());
        int n=nums.size();
        int sum=0;
        for(int i=0;i<n;i++){
   
            sum+=nums[i];
        }
        int ans=sum%3;
        //cout<<ans<<" "<<sum<<endl;
        if(ans==0) return sum;
        else if(ans==1){
   
            // 有一个余数为1
            int one=0,two=0;
            int flag=0;
            for(int i=0;i<n;i++){
   
                if(nums[i]%3==1&&one==0){
   
                    one=nums[i];
                }
                else if(nums[i]%3==2){
   
                    if(flag==0){
   
                        two=nums[i];
                        flag=1;
                    }else if(flag==1){
   
                        two+=nums[i];
                        flag=2;
                    }
                }
            }
            if(one!=0){
   
                if(flag==2){
   
                    return sum-min(one,two);
                }else return sum-one;
            }else if(flag==2){
   
                return sum-two;
            }
        }else if(ans==2){
   
            int one=0,two=0;
            int flag=0;
            for(int i=0;i<n;i++){
   
                if(nums[i]%3==2&&two==0){
   
                    two=nums[i];
                }
                else if(nums[i]%3==1){
   
                    if(flag==0){
   
                        one=nums[i];
                        flag=1;
                    }else if(flag==1){
   
                        one+=nums[i];
                        flag=2;
                    }
                }
            }
            if(two!=0){
   
                if(flag==2){
   
                    return sum-min(one,two);
                }else return sum-two;
            }else if(flag==2){
   
                return sum-one;
            }
        }
        return 0;
    }
};
目录
相关文章
|
11月前
|
运维 监控 Java
|
10月前
|
缓存 监控 Linux
Linux性能分析利器:全面掌握perf工具
【10月更文挑战第18天】 在Linux系统中,性能分析是确保软件运行效率的关键步骤。`perf`工具,作为Linux内核自带的性能分析工具,为开发者提供了强大的性能监控和分析能力。本文将全面介绍`perf`工具的使用,帮助你成为性能优化的高手。
564 1
|
iOS开发
我给 iOS 系统打了个补丁——修复 iOS 16 系统键盘重大 Crash(下)
我给 iOS 系统打了个补丁——修复 iOS 16 系统键盘重大 Crash(下)
691 1
|
消息中间件 Java BI
使用Java和Spring Batch实现批处理
使用Java和Spring Batch实现批处理
|
Kubernetes 负载均衡 容器
Cloud Controller Manager
Cloud Controller Manager是Kubernetes的一个组件,它提供了一个控制平面,用于管理Kubernetes集群。Cloud Controller Manager通过插件机制,可以对接各种云服务提供商的资源,例如阿里云的负载均衡(CLB,原SLB)、虚拟私有云(VPC)等。这样,Kubernetes集群就可以与这些云服务商的资源进行交互,实现负载均衡、跨节点通信等功能。
467 1
|
数据可视化 数据建模 数据安全/隐私保护
|
JSON 移动开发 前端开发
CORS跨域资源共享(一):模拟跨域请求以及结果分析,理解同源策略【享学Spring MVC】(上)
CORS跨域资源共享(一):模拟跨域请求以及结果分析,理解同源策略【享学Spring MVC】(上)
CORS跨域资源共享(一):模拟跨域请求以及结果分析,理解同源策略【享学Spring MVC】(上)
|
运维 前端开发 jenkins
Devops 开发运维高级篇之Jenkins+Docker+SpringCloud微服务持续集成——部署方案优化
之前我们做的方案部署都是只能选择一个微服务部署并只有一台生产服务器,每个微服务只有一个实例,容错率低 如何去解决?
1040 1
Devops 开发运维高级篇之Jenkins+Docker+SpringCloud微服务持续集成——部署方案优化
|
Shell Linux 数据安全/隐私保护
8.21 Linux切换用户的有效群组(newgrp命令)
我们知道,每个用户可以属于一个初始组(用户是这个组的初始用户),也可以属于多个附加组(用户是这个组的附加用户)。既然用户可以属于这么多用户组,那么用户在创建文件后,默认生效的组身份是哪个呢?
622 0
8.21 Linux切换用户的有效群组(newgrp命令)
|
存储 数据采集 Kubernetes
Data Mesh的原则和逻辑架构-数据架构参考
原文链接:[https://martinfowler.com/articles/data-mesh-principles.html](https://link.zhihu.com/?target=https%3A//martinfowler.com/articles/data-mesh-principles.html) 作者简介:Zhamak是Thoughtworks的首席技术顾问,专注于企业的分布式系统架构和数字平台策略。作为Thoughtworks技术顾问委员会的成员,她为创建Thoughtworks技术雷达做出了贡献。
773 0