首页 > 其他分享 >力扣---1262. 可被三整除的最大和

力扣---1262. 可被三整除的最大和

时间:2023-01-01 16:44:22浏览次数:37  
标签:--- get int res list1 list2 力扣 1262 dp

给你一个整数数组 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 整除的最大和)。

提示:
    1 <= nums.length <= 4 * 10^4
    1 <= nums[i] <= 10^4
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/greatest-sum-divisible-by-three
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

 

这道题可以用两种方法来做,一种是动态规划,一种是纯粹的数学方法。

讲解放注释了,其他没啥需要注意的地方。

代码如下:


数学方法:

class Solution {
    public int maxSumDivThree(int[] nums) {
        int res = 0;
        //存储余1的数
        List<Integer> list1 = new ArrayList<>();
        //存储余2的数
        List<Integer> list2 = new ArrayList<>();
        for (int i : nums) {
            if (i % 3 == 1) {
                list1.add(i);
            } else if (i % 3 == 2) {
                list2.add(i);
            }
            res += i;
        }
        //可以整除代表所有的数字之和符合题意,直接返回
        if (res % 3 == 0) {
            return res;
        }
        //从小到大排序
        list1.sort((a, b) -> (a - b));
        list2.sort((a, b) -> (a - b));
        if (res % 3 == 1) {
            //考虑列表越界情况。
            if (list1.size() > 0) {
                if (list2.size() > 1) {
                    //余数为1时,答案等于所有数字之和减去一个余数为1的数字,或者减去两个余数为2的数字。
                    res -= Math.min(list1.get(0), list2.get(0) + list2.get(1));
                } else {
                    res -= list1.get(0);
                }
            } else {
                res -= list2.get(0) + list2.get(1);
            }
        } else {
            //考虑列表越界情况。
            if (list1.size() > 1) {
                if (list2.size() > 0) {
                    //余数为2时,答案等于所有数字之和减去两个余数为1的数字,或者减去一个余数为2的数字。
                    res -= Math.min(list2.get(0), list1.get(0) + list1.get(1));
                } else {
                    res -= list1.get(0) + list1.get(1);
                }
            } else {
                res -= list2.get(0);
            }
        }
        return res;
    }
}

运行结果:

数学方法

 

动态规划

class Solution {
    public int maxSumDivThree(int[] nums) {
        //由于余数为0,1,2的和在之后都有可能变成余数为0,所以需要同时维护三种情况的最大值。
        int[] dp = new int[3];
        for (int num : nums) {
            // 三种情况都加,判断最大值。
            int a = dp[0] + num;
            int b = dp[1] + num;
            int c = dp[2] + num;
            dp[a % 3] = Math.max(dp[a % 3], a);
            dp[b % 3] = Math.max(dp[b % 3], b);
            dp[c % 3] = Math.max(dp[c % 3], c);
        }
        return dp[0];
    }
}

运行结果:

动态规划

 

标签:---,get,int,res,list1,list2,力扣,1262,dp
From: https://www.cnblogs.com/allWu/p/17018246.html

相关文章

  • 关于微服务,这些你都了解吗-微服务介绍
    目录一认识微服务1.1什么是微服务1.2微服务的特点1.3微服务诞生背景1.4微服务架构的优势二微服务生态1.1硬件层1.2通信层1.3应用平台层1.4微服务层三微服务详解......
  • 机器学习--要学点什么
    前言可以说掌握了机器学习,你就具备了与机器对话,充分利用机器为人类服务的能力。在人工智能时代,这将成为一项必备技能,就好比十年前你是编程大牛,二十年前你英语超好一样。......
  • Flutter 陈航 11-生命周期 WidgetsBindingObserver
    本文地址目录目录目录11|提到生命周期,我们是在说什么?State生命周期生命周期流程图生命周期的三个阶段创建更新销毁注意!!!常见场景的生命周期生命周期方法总结测试代码S......
  • 10、Nacos配置中心-命名空间与配置分组
    一、命名空间:配置隔离默认:public(保留空间):默认新增的所有配置都在public空间1)环境隔离:开发(dev)、测试(test)、生产(prod),利用命名空间来做环境隔离注意:在bootstrap.ym......
  • AtCoder Beginner Contest 283 - a new beginning
    许久没有写过博客了,让2023成为一个新的起点,重新开始写博客。尽量写的高质量一点,从E开始。E-Don'tIsolateElements考虑dp,考虑如何设计状态。不难看出,每一行变两......
  • 对象到对象映射-AutoMapper
    AutoMapper是一个对象-对象映射器,可以将一个对象映射到另一个对象。用来解决一个看似复杂的问题,这种类型的代码编写起来相当枯燥乏味,官网地址:​​http://automapper.org/​......
  • grafana-用户管理
    账户设置:     ......
  • X300 DP Plus Program 2020 TOYOTA AVALON 8A-AA Smart Key
    WithOBDSTARCANDirectKit,X300DPPluscanreadIMMOdata,makesimulatedcardandaddkeyswithfreepincdoeto2020TOYOTAAVALONlikeacharm.It’seasy......
  • web项目开发---第三天
    ssm核心业务crm项目的简介:CustomerrelationshipManagement客户关系管理系统销售或者贸易型公司使用。企业级应用,内部员工使用。java开发的传统软件。CRM项目的宗旨......
  • CVE-2022-26923 Windows域提权漏洞
    前言ActiveDirectory域服务,是一种目录服务,提供了存储目录数据信息以及用户相关的一些密码,电话号码等等一些数据信息,且可让用户和管理员使用这些数据,有利于域管理员对用......