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

豆包 LeetCode 3197. 包含所有 1 的最小矩形面积 II Java实现

题目大意

给定一个二维二进制矩阵,用 3 个互不重叠、面积非零 的轴对齐矩形覆盖矩阵中所有的 1,矩形可以相接但不能重叠,求三个矩形的面积之和的最小值。
数据范围:矩阵行列数均不超过 30。

核心思路

所有合法的三矩形不重叠布局,都可以归为以下 6 类切割模式,只需枚举所有切割线的位置,计算每种模式下的最小面积和,最终取全局最小值即可:

1. 两条水平切割线,将矩阵分为上、中、下三部分
2. 两条竖直切割线,将矩阵分为左、中、右三部分
3. 一条水平切割线分为上下,上半部分再用一条竖直切割线拆分
4. 一条水平切割线分为上下,下半部分再用一条竖直切割线拆分
5. 一条竖直切割线分为左右,左半部分再用一条水平切割线拆分
6. 一条竖直切割线分为左右,右半部分再用一条水平切割线拆分

对每个切割后的子区域,计算其内部所有 1 的最小包围矩形面积,求和后更新最小值。

Java 完整实现

java
class Solution {
public int minimumSum(int[][] grid) {
int m = grid.length, n = grid[0].length;
int minSum = Integer.MAX_VALUE;

// 1. 两条水平分割线:上、中、下三部分
for (int i = 0; i < m - 1; i++) {
for (int j = i + 1; j < m - 1; j++) {
int top = calcArea(grid, 0, 0, i, n - 1);
int mid = calcArea(grid, i + 1, 0, j, n - 1);
int bot = calcArea(grid, j + 1, 0, m - 1, n - 1);
minSum = Math.min(minSum, top + mid + bot);
}
}

// 2. 两条竖直分割线:左、中、右三部分
for (int i = 0; i < n - 1; i++) {
for (int j = i + 1; j < n - 1; j++) {
int left = calcArea(grid, 0, 0, m - 1, i);
int mid = calcArea(grid, 0, i + 1, m - 1, j);
int right = calcArea(grid, 0, j + 1, m - 1, n - 1);
minSum = Math.min(minSum, left + mid + right);
}
}

// 3. 水平分割后,上半部分再竖直分割
for (int hori = 0; hori < m - 1; hori++) {
for (int vert = 0; vert < n - 1; vert++) {
int topLeft = calcArea(grid, 0, 0, hori, vert);
int topRight = calcArea(grid, 0, vert + 1, hori, n - 1);
int bottom = calcArea(grid, hori + 1, 0, m - 1, n - 1);
minSum = Math.min(minSum, topLeft + topRight + bottom);
}
}

// 4. 水平分割后,下半部分再竖直分割
for (int hori = 0; hori < m - 1; hori++) {
for (int vert = 0; vert < n - 1; vert++) {
int top = calcArea(grid, 0, 0, hori, n - 1);
int botLeft = calcArea(grid, hori + 1, 0, m - 1, vert);
int botRight = calcArea(grid, hori + 1, vert + 1, m - 1, n - 1);
minSum = Math.min(minSum, top + botLeft + botRight);
}
}

// 5. 竖直分割后,左半部分再水平分割
for (int vert = 0; vert < n - 1; vert++) {
for (int hori = 0; hori < m - 1; hori++) {
int leftTop = calcArea(grid, 0, 0, hori, vert);
int leftBot = calcArea(grid, hori + 1, 0, m - 1, vert);
int right = calcArea(grid, 0, vert + 1, m - 1, n - 1);
minSum = Math.min(minSum, leftTop + leftBot + right);
}
}

// 6. 竖直分割后,右半部分再水平分割
for (int vert = 0; vert < n - 1; vert++) {
for (int hori = 0; hori < m - 1; hori++) {
int left = calcArea(grid, 0, 0, m - 1, vert);
int rightTop = calcArea(grid, 0, vert + 1, hori, n - 1);
int rightBot = calcArea(grid, hori + 1, vert + 1, m - 1, n - 1);
minSum = Math.min(minSum, left + rightTop + rightBot);
}
}

return minSum;
}

// 计算子矩阵 [x1,y1] ~ [x2,y2] 中所有1的最小包围矩形面积,无1则返回0
private int calcArea(int[][] grid, int x1, int y1, int x2, int y2) {
int minX = Integer.MAX_VALUE, maxX = Integer.MIN_VALUE;
int minY = Integer.MAX_VALUE, maxY = Integer.MIN_VALUE;
boolean hasOne = false;
for (int i = x1; i <= x2; i++) {
for (int j = y1; j <= y2; j++) {
if (grid[i][j] == 1) {
hasOne = true;
minX = Math.min(minX, i);
maxX = Math.max(maxX, i);
minY = Math.min(minY, j);
maxY = Math.max(maxY, j);
}
}
}
return hasOne ? (maxX - minX + 1) * (maxY - minY + 1) : 0;
}
}


复杂度分析

- 时间复杂度:O(m^2n + mn^2),其中 m,n 为矩阵行列数(最大30)。枚举切割线共约 4000 种组合,单次面积计算遍历子矩阵,总运算量在 1e6 级别,Java 可稳定通过。
- 空间复杂度:O(1),仅使用常数额外空间。

需要我补充前缀和优化版代码(将单次面积计算降为 O(1)),或者添加测试用例验证吗?

http://www.zskr.cn/news/1516381.html

相关文章:

  • 从控制点到光滑曲面:Matlab B样条(spmak/spcrv)实战指南,做CAD/动画必看
  • 2026年驻马店市黄金回收白银回收铂金回收彩金回收 地址联系大全+支持现场结算无套路 - 前途无量YY
  • 保姆级教程:在RK3568开发板上搞定广和通FG650 5G模组(从驱动修改到自动拨号)
  • 遗传算法工程化落地:编码策略、算子设计与收敛诊断实战
  • 闲置黄金变现最佳时机 2026鄂州黄金计价与正规回收盘点 - 润富黄金回收
  • 2026年安徽省初中考不上高中有哪些学校可以选择?最新择校指南 - 我叫小周
  • AurigaNet:自动驾驶多任务实时感知网络架构解析
  • 专升本语文作文题目|语文作文|资料已整理
  • 2026四川市民高频选择的 5 家实体水质检测饮用水检测井水检测第三方实地测评整理 - 诚金汇钻回收公司
  • ESP32玩转OLED屏?手把手教你用U8g2模拟器搞定UI布局,省下80%调试时间
  • 2026七台河本地企业认可的 5 家电能质量评估服务机构实地测评汇总 - 中检检测集团
  • 2026金华黄金回收全攻略三家实体店实测 - 润富黄金回收
  • 2026 年六大主流 AI 简历工具测评:从 ATS 适配到投递效率,一次讲透怎么选
  • 2026东营老百姓优先选择的五家贵金属回收店 黄金回收白银回收铂金金条回收合规门店测评合集 - 信誉隆金银铂奢回收
  • 2026年庄河市黄金回收白银回收铂金回收彩金回收 地址联系大全+支持现场结算无套路 - 前途无量YY
  • 2026最新诚信优选阳泉市黄金回收白银回收铂金回收彩金回收去哪卖?五家实地探访靠谱门店汇总及联系方式推荐 - 亦辰小黄鸭
  • 2026常州本地危房检测房屋安全鉴定哪家专业?TOP 正规机构榜单 + 联系方式 - 鉴安检测
  • 别只盯着建图!用思岚A1激光雷达和ROS,5分钟实现一个动态障碍物检测Demo
  • 别光会调用API!深入LVGL V8.3.9源码,图解TabView事件处理与滑动禁用的底层逻辑
  • 2026年资阳市黄金回收白银回收铂金回收彩金回收 地址联系大全+支持现场结算无套路 - 前途无量YY
  • 猫抓浏览器扩展完整教程:3分钟学会网页视频下载神器
  • 2026年淄博市黄金回收白银回收铂金回收彩金回收 地址联系大全+支持现场结算无套路 - 前途无量YY
  • 别再死记硬背DID了!聊聊UDS 0x22服务背后的设计哲学:从单DID到Composite DID的灵活配置
  • 从Halcon轮廓合并到实际应用:如何用union_adjacent_contours_xld搞定PCB板断线检测?
  • 2026葫芦岛市民高频选择的 5 家实体水质检测饮用水检测井水检测第三方实地测评整理 - 诚金汇钻回收公司
  • 手把手调参:BBA算法里的Reservoir和Cushion到底怎么设?一个参数搞砸你的视频流畅度
  • 工业三色灯品牌质量实测:四大主流品牌核心维度对比 - 奔跑123
  • 2026晋中本地企业认可的 5 家电能质量评估服务机构实地测评汇总 - 中检检测集团
  • GitHub中文界面插件:让GitHub说中文的3分钟解决方案
  • 基于PLC四轴机械臂控制系统设计412(设计源文件+万字报告+讲解)(支持资料、图片参考_降重降ai)