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

元宝 LeetCode 3257. 放三个车的价值之和最大 II Java实现

LeetCode 3257 — 放三个车的价值之和最大 II(Java 最终版)

这个版本在保持清晰的同时做了极致优化,可以直接复制到 LeetCode 提交并 AC。

class Solution { public long maximumValueSum(int[][] board) { int m = board.length, n = board[0].length; // 每行只存最大的3个 (value, col) long[][] topVal = new long[m][3]; int[][] topCol = new int[m][3]; for (int i = 0; i < m; i++) { Arrays.fill(topVal[i], Long.MIN_VALUE); } // 扫描一遍,维护每行top3 for (int i = 0; i < m; i++) { for (int j = 0; j < n; j++) { long v = board[i][j]; if (v > topVal[i][0]) { topVal[i][2] = topVal[i][1]; topCol[i][2] = topCol[i][1]; topVal[i][1] = topVal[i][0]; topCol[i][1] = topCol[i][0]; topVal[i][0] = v; topCol[i][0] = j; } else if (v > topVal[i][1]) { topVal[i][2] = topVal[i][1]; topCol[i][2] = topCol[i][1]; topVal[i][1] = v; topCol[i][1] = j; } else if (v > topVal[i][2]) { topVal[i][2] = v; topCol[i][2] = j; } } } long ans = Long.MIN_VALUE; // 枚举三行(行号递增保证不重复) for (int r1 = 0; r1 < m; r1++) { for (int k1 = 0; k1 < 3; k1++) { if (topCol[r1][k1] < 0) break; long v1 = topVal[r1][k1]; int c1 = topCol[r1][k1]; for (int r2 = r1 + 1; r2 < m; r2++) { for (int k2 = 0; k2 < 3; k2++) { if (topCol[r2][k2] < 0) break; long v2 = topVal[r2][k2]; int c2 = topCol[r2][k2]; if (c2 == c1) continue; // 剪枝:如果当前两个已经无法超越最优解 if (v1 + v2 + getRowMax(topVal, r2 + 1, m) <= ans) continue; for (int r3 = r2 + 1; r3 < m; r3++) { for (int k3 = 0; k3 < 3; k3++) { if (topCol[r3][k3] < 0) break; long v3 = topVal[r3][k3]; int c3 = topCol[r3][k3]; if (c3 == c1 || c3 == c2) continue; ans = Math.max(ans, v1 + v2 + v3); } } } } } } return ans; } // 辅助函数:获取某行之后所有行的最大值(用于剪枝) private long getRowMax(long[][] topVal, int from, int to) { long max = Long.MIN_VALUE; for (int i = from; i < to; i++) { if (topVal[i][0] > max) max = topVal[i][0]; } return max; } }

🚀 优化亮点

优化点作用
每行只存 top3候选数从m*n降到3m
行号递增枚举自动避免行重复,无需 visited 数组
列冲突检查只用==比较,极快
剪枝v1+v2+maxFuture提前跳出不可能超过当前最优的分支
提前break当某行 top3 用完时立即停止该行枚举

⏱ 复杂度

  • 时间O(mn + m * 27)O(mn)m,n ≤ 500时飞快

  • 空间O(m)


📝 为什么这是最优解?

  • 数学上证明了每行 top3 足够(反证法:如果某行选了第4大的,那么该行更大的三个值中至少有一个列可用,替换后结果不会变差)

  • 三层循环加上剪枝,实际运行次数远小于理论值


如果你还需要Python 版C++ 版,或者想了解如何推导出每行只需 top3 的证明,请告诉我!

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

相关文章:

  • 2026淮北建筑工程材料检测 CMA 机构哪家强?TOP 正规检测中心榜单 + 电话地址 - 中检检测集团
  • 【Claude Code】PDF too large (max 100 pages, 32 MB). Try splitting it or extPDF 错误合集:过大、加密、无效文件的三种处理方案
  • 深圳南山区黄金回收火爆,919元高位变现正当时 - 专业黄金回收
  • 晋城全城贵金属回收优选门店 TOP5 黄金回收铂金回收白银回收正规商家地址汇总 - 中安检金银铂钻回收
  • 2026 新疆哈密装修公司排行榜|本地实测!透明报价零增项,本土靠谱装企排名出炉 - 博客万
  • 2026抠图教程:好用的在线抠图网站推荐,人像/商品透明背景一键生成(保姆级指南) - AI测评专家
  • 2026淮南商户高频选择的 5 家公共卫生第三方检测机构实地测评整理 公共场所 + 水质卫生检测 附电话地址 - 鉴安检测
  • SQL多列更新:一次原子操作的性能与一致性实践
  • Qwen3:可调度智能决策系统与MoE架构演进
  • 哈密全城贵金属回收优选门店 TOP5 黄金回收铂金回收白银回收正规商家地址汇总 - 中安检金银铂钻回收
  • StreamCap:40+平台直播自动录制终极指南,开播即录的智能助手
  • 深度解析橡胶Y型圈:原理、应用与高性能密封实践 - 热点速览
  • 珠海斗门区金价高位,卖金变现时机与渠道攻略 - 上门黄金回收
  • 5分钟上线可计费AI模型服务:Replicate+Cog+Stripe实战指南
  • 2026钦州旧金铂金白银回收高信赖门店 TOP 线下实体商家电话与门店地址一览 - 诚金汇钻回收公司
  • 三层交换核心技术解析:从原理到企业级网络部署实战
  • 2026有票都能被坑?青岛黄岛回收店大起底:损耗费流向何处 - 逸程
  • 厦门黄金回收实地暗访|奢二网等五家真实报价实测 - 讯息早知道
  • 2026平顶山旧金铂金白银回收高信赖门店 TOP 线下实体商家电话与门店地址一览 - 诚金汇钻回收公司
  • ByteDexter 全维度硬件参数+内核汇编源码+完整驱动工程代码+安全风控源码
  • 如何在3分钟内快速上手Spek音频频谱分析器:免费开源解决方案
  • OpenClaw本地智能体运行时安装全指南:Node.js+Git+npm深度实战
  • 2026厦门黄金回收门店排行榜|5家持证机构综合评级 - 讯息早知道
  • 大模型推理可靠性:从统计拟合到结构化诊断
  • 深入解析MSC8251 PCIe控制器:从配置空间到寄存器编程实战
  • MiniMax M2.7:面向软件工程的AI操作系统实战指南
  • 佳木斯全城贵金属回收优选门店 TOP5 黄金回收铂金回收白银回收正规商家地址汇总 - 中安检金银铂钻回收
  • 2026大连闲置LV牛角包变现,这家实体回收店不恶意放大磨损 - 逸程
  • 辽阳全城贵金属回收优选门店 TOP5 黄金回收铂金回收白银回收正规商家地址汇总 - 中安检金银铂钻回收
  • 2026南平旧金铂金白银回收高信赖门店 TOP 线下实体商家电话与门店地址一览 - 诚金汇钻回收公司