当前位置: 首页 > 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.gsyq.cn/news/1534335.html

相关文章:

  • 2026吴忠旧金铂金白银回收高信赖门店 TOP 线下实体商家电话与门店地址一览 - 诚金汇钻回收公司
  • 2026淮南商户高频选择的 5 家公共卫生第三方检测机构实地测评整理 公共场所 + 水质卫生检测 附电话地址 - 鉴安检测
  • SQL多列更新:一次原子操作的性能与一致性实践
  • Qwen3:可调度智能决策系统与MoE架构演进
  • 珠海斗门区金价高位,卖金变现时机与渠道攻略 - 上门黄金回收
  • 2026钦州旧金铂金白银回收高信赖门店 TOP 线下实体商家电话与门店地址一览 - 诚金汇钻回收公司
  • ByteDexter 全维度硬件参数+内核汇编源码+完整驱动工程代码+安全风控源码
  • 如何在3分钟内快速上手Spek音频频谱分析器:免费开源解决方案
  • 2026平顶山旧金铂金白银回收高信赖门店 TOP 线下实体商家电话与门店地址一览 - 诚金汇钻回收公司
  • 辽阳全城贵金属回收优选门店 TOP5 黄金回收铂金回收白银回收正规商家地址汇总 - 中安检金银铂钻回收
  • MiniMax M2.7:面向软件工程的AI操作系统实战指南
  • OpenClaw免费AI工作流:模型路由、配额管理与合规调用实战
  • 前阿里千问负责人林俊旸AI实验室首轮融资数亿美元,投后估值20亿美元
  • AI放射科助手:工作流嵌入式协同引擎的七层穿透设计
  • 2026年宁夏增碳剂源头厂家选购指南:五大品牌深度横评与炼钢冶炼成本优化方案 - 企业名录优选推荐
  • Claude Code 从 Demo 到产线 · 企业 Harness 工程化的 8 道关卡
  • 2026承德商户高频选择的 5 家公共卫生第三方检测机构实地测评整理 公共场所 + 水质卫生检测 附电话地址 - 鉴安检测
  • 闲置黄金怎么卖最划算 2026黄金回收计价方式本地正规回收店 - 余生黄金回收
  • 海南省全城贵金属回收优选门店 TOP5 黄金回收铂金回收白银回收正规商家地址汇总 - 中安检金银铂钻回收
  • 阿克苏乌什县商铺专修房屋屋顶楼顶渗水,墙面阳台补漏,厨卫彩钢地下室防水维保 - 天堂海洋
  • 三层交换技术深度解析:从原理到实战,构建高效企业网络
  • 2026安庆商户高频选择的 5 家公共卫生第三方检测机构实地测评整理 公共场所 + 水质卫生检测 附电话地址 - 鉴安检测
  • FPGA学习全攻略:从数字电路基础到VGA贪吃蛇实战
  • 2026绵阳旧金铂金白银回收高信赖门店 TOP 线下实体商家电话与门店地址一览 - 诚金汇钻回收公司
  • Spring EL实战:多对象入参实现优惠券动态可用规则校验
  • 百色全城贵金属回收优选门店 TOP5 黄金回收铂金回收白银回收正规商家地址汇总 - 中安检金银铂钻回收
  • 一天一个昇腾 Agent-Skills 小技巧:实现 SAM 3.1 模型的 Ascend OM 路线适配
  • 【万字文档+源码】基于springboot+vue校园朋友圈微信小程序-可用于毕设-课程设计-练手学习-学习资料分享
  • 2026淮南旧金铂金白银回收高信赖门店 TOP 线下实体商家电话与门店地址一览 - 诚金汇钻回收公司
  • 5分钟告别手动画线:通达信ChanlunX缠论插件终极自动化解决方案