当前位置: 首页 > news >正文

2026-04-28:能被 3 整除的三元组最大和。用go语言,在数组 nums 中挑选出恰好三个数,使得这三个数的总和可以被 3 整除。 要求计算所有满足条件的三元组里,它们的三个数之和所能达到的最

2026-04-28:能被 3 整除的三元组最大和。用go语言,在数组 nums 中挑选出恰好三个数,使得这三个数的总和可以被 3 整除。

要求计算所有满足条件的三元组里,它们的三个数之和所能达到的最大值;如果完全找不到满足条件的三元组,则结果为 0。

3 <= nums.length <= 100000。

1 <= nums[i] <= 100000。

输入: nums = [4,2,3,1]。

输出: 9。

解释:

总和能被 3 整除的有效三元组为:

(4, 2, 3),和为 4 + 2 + 3 = 9。

(2, 3, 1),和为 2 + 3 + 1 = 6。

因此,答案是 9。

题目来自力扣3779。

解题过程详细解析

一、核心定义与初始化准备

1. 关键常量定义

  • K=3:我们必须恰好选3个数字,这是固定要求;
  • MOD=3:判断和能否被3整除,只需要看总和对3取余的结果(余数只能是0、1、2)。

2. 动态规划数组定义

创建二维数组f,格式:f[选了i个数][余数为r] = 最大和

  • 第一维:0~3,代表当前选中的数字个数(0个、1个、2个、3个);
  • 第二维:0~2,代表当前数字总和对3取余的结果
  • 数组值:存储对应状态下的最大总和

3. 数组初始化

  • 所有位置默认赋值为负无穷(表示初始状态不可达,没有有效数字);
  • 唯一初始有效状态:f[0][0] = 0(选0个数,总和为0,余数0,和为0)。

二、核心遍历逻辑(逐个处理数组中的数字)

遍历数组里的每一个数字x从后往前更新动态规划数组(避免重复使用同一个数字),核心规则:
对于当前已选j个数字、余数为r的状态,加入数字x后,会变成:选j+1个数字、余数为(r+x)%3,总和变为 原总和 + x
我们只保留每个状态下的最大总和

分步处理示例(输入数组:[4,2,3,1])

我们一步步看每个数字处理后,状态的变化:

  1. 处理第一个数字 4

    • 4对3取余=1;
    • 从选0个、余数0的状态,更新为:选1个、余数1,和为4;
    • 此时有效状态:选1个余数1=4。
  2. 处理第二个数字 2

    • 2对3取余=2;
    • 基于选0个的状态:新增 选1个余数2=2;
    • 基于选1个余数1的状态:新增 选2个余数0=4+2=6;
    • 此时有效状态:选1个(1=4、2=2),选2个(0=6)。
  3. 处理第三个数字 3

    • 3对3取余=0;
    • 基于选0个:新增 选1个余数0=3;
    • 基于选1个:更新选2个的最大和(余数1=4+3=7、余数2=2+3=5);
    • 基于选2个余数0:更新选3个余数0=6+3=9(这就是最终答案);
    • 此时已经得到:恰好选3个数、余数0、和为9。
  4. 处理第四个数字 1

    • 1对3取余=1;
    • 继续更新所有状态,会得到另一个三元组和为6;
    • 对比后,最大和依旧是9。

三、最终结果计算

遍历结束后,我们只需要看一个目标状态:
f[3][0]恰好选3个数字,总和余数为0(能被3整除)的最大和

  • 如果这个值大于0,就返回它;
  • 如果这个值无效(负无穷),说明没有符合条件的三元组,返回0。

示例中f[3][0]=9,所以最终输出9。


四、时间复杂度 & 额外空间复杂度

1. 时间复杂度

  • 设数组长度为n(最大10万);
  • 动态规划的两层固定循环:选数字个数(3次)+ 余数(3次)= 固定9次操作;
  • 总操作次数 =n × 9,是线性复杂度;
  • 时间复杂度:O(n)

2. 额外空间复杂度

  • 动态规划数组是固定大小:4行 × 3列 = 12个元素
  • 空间大小不随数组长度变化,是常数级空间;
  • 额外空间复杂度:O(1)

总结

  1. 解题核心:用动态规划记录「选几个数+总和余数」的最大和,精准匹配「恰好3个数、能被3整除」的要求;
  2. 处理逻辑:逐个遍历数字,更新所有可能的状态,只保留最大和;
  3. 效率:时间O(n)(处理10万数据极快),空间O(1)(占用内存极小),完全满足题目数据规模要求。

Go完整代码如下:

packagemainimport("fmt""math")funcmaximumSum(nums[]int)int{constK=3constMOD=3f:=[K+1][MOD]int{}fori:=rangef{forj:=rangef[i]{f[i][j]=math.MinInt}}f[0][0]=0for_,x:=rangenums{forj:=K-1;j>=0;j--{forr:=rangeMOD{f[j+1][(r+x)%MOD]=max(f[j+1][(r+x)%MOD],f[j][r]+x)}}}returnmax(f[K][0],0)}funcmain(){nums:=[]int{4,2,3,1}result:=maximumSum(nums)fmt.Println(result)}

Python完整代码如下:

# -*-coding:utf-8-*-importmathdefmaximum_sum(nums):K=3MOD=3# 初始化 dp 表,dp[j][r] 表示选 j 个数,和模 MOD 为 r 的最大和dp=[[-math.inf]*MODfor_inrange(K+1)]dp[0][0]=0forxinnums:# 倒序更新 j,确保每个数最多选一次(0/1 背包)forjinrange(K-1,-1,-1):forrinrange(MOD):# 避免在更新过程中使用本轮已更新的值,倒序 j 已保证new_r=(r+x)%MODifdp[j][r]!=-math.inf:dp[j+1][new_r]=max(dp[j+1][new_r],dp[j][r]+x)# 返回选恰好 K 个数且和能被 MOD 整除的最大和,若不存在则返回 0returnmax(dp[K][0],0)if__name__=="__main__":nums=[4,2,3,1]result=maximum_sum(nums)print(result)

C++完整代码如下:

#include<iostream>#include<vector>#include<algorithm>#include<climits>usingnamespacestd;intmaximumSum(vector<int>&nums){constintK=3;constintMOD=3;// 初始化 dp 表,f[j][r] 表示选 j 个数,和模 MOD 为 r 的最大和vector<vector<int>>f(K+1,vector<int>(MOD,INT_MIN));f[0][0]=0;for(intx:nums){// 倒序更新 j,确保每个数只使用一次for(intj=K-1;j>=0;j--){for(intr=0;r<MOD;r++){if(f[j][r]!=INT_MIN){intnew_r=(r+x)%MOD;f[j+1][new_r]=max(f[j+1][new_r],f[j][r]+x);}}}}// 返回选恰好 K 个数且和能被 MOD 整除的最大和,若不存在则返回 0returnmax(f[K][0],0);}intmain(){vector<int>nums={4,2,3,1};intresult=maximumSum(nums);cout<<result<<endl;return0;}

http://www.jsqmd.com/news/713300/

相关文章:

  • signal核心功能详解:钢琴卷帘、编曲视图与速度控制完整指南
  • 别再傻傻分不清:PDI-CE 9.4.0.0-343 和 Pentaho Server CE 到底该下哪个?
  • 进程的状态
  • 微信单向好友终极检测指南:3步识别谁已删除或拉黑你
  • 5个关键步骤:MinerU如何帮助企业破解PDF数据提取的GDPR合规难题
  • 说说筛选咨询公司要点,国内特别是北京地区有哪些靠谱品牌推荐? - 工业品网
  • LocalSend社区全景解析:揭秘开源协作的全球化力量
  • 如何快速掌握Res-Downloader:三分钟实现全网资源智能抓取与下载
  • 2026柴油机火花熄灭器生产厂家推荐:免维护方案筑牢高危行业安全防线 - 速递信息
  • Locale-Emulator终极指南:三步解决Windows程序语言乱码问题
  • 告别资源管理器!OneCommander 3.x 保姆级安装与自定义配置指南(Win10/11)
  • 【python大作业/爬虫实战】——基于京东商品评论的爬虫数据采集+可视化+情感分析(附完整代码)
  • 分析2026年适配水肥一体化的硫酸氢钾供应商,哪家值得选 - 工业品网
  • 告别复杂网络编程:三行代码搞定Python/Node.js/Go HTTP请求的终极指南
  • 【深度解析】分子筛吸附:核心原理、适用范围与工程实践 - 速递信息
  • SD-PPP:终极Photoshop AI插件完整指南 - 让AI绘图与Photoshop无缝协作
  • AI专著撰写秘籍!4款AI工具助力,一键生成20万字专著不是梦!
  • 别再抱怨MIUI广告多了!这份保姆级‘去广告’清单,覆盖天气、日历、浏览器等隐藏角落
  • WindowsCleaner:专治C盘爆红的Windows系统清理终极方案
  • Turborepo Docker集成:容器化构建环境的终极部署指南
  • Cypress终极指南:轻松解决99%前端测试痛点,实现后台同步验证
  • 第三章 修改数据
  • 探讨2026年惠州靠谱的源头大吊扇厂家,阿环达环境科技口碑怎么样? - 工业品网
  • 现在不配,下周就掉队!VS Code Copilot Next 2024.9新特性强制依赖项解析,3个必须升级的扩展版本号
  • 终极对决:2025年前端动画性能王者Lottie-Web vs Web Animations API深度测评
  • 高级虚拟显示器实战:3种高效配置方案深度解析
  • 终极指南:三步轻松备份你的QQ空间历史说说 [特殊字符]️
  • 终极NCM解密指南:如何快速破解网易云音乐加密格式限制
  • Omni-Vision Sanctuary 学术研究助手:自动化文献综述与学术图表描述生成
  • 做电商主图的时候经常卡在两件事上:一是手边没电脑,临时要抠一张商品图只能干等;二是免费网页工具要么限次数,要么下载时弹窗让你开会员。在线抠图工具这两年迭代速度很快,微信小程序这类载体也开始成熟,这篇文