当前位置: 首页 > 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.jsqmd.com/news/1004600/

相关文章:

  • 2026平凉市民高频选择的 5 家实体水质检测饮用水检测井水检测第三方实地测评整理 - 诚金汇钻回收公司
  • 从控制点到光滑曲面:Matlab B样条(spmak/spcrv)实战指南,做CAD/动画必看
  • 2026年RPA怎么选?企业真正该看的不是功能列表
  • 从SGD到PGD:当你的模型参数需要‘画地为牢’时,这个优化器可能比Adam更管用
  • 2026常德本地危房检测房屋安全鉴定哪家专业?TOP 正规机构榜单 + 联系方式 - 鉴安检测
  • 手把手调试PLL锁定指示电路:从模拟/数字信号到Arduino监测的实战
  • 从单轮到多轮:AI提示词编排实战
  • 广元卖黄金怕被坑 一文看懂计价规则与实测解读 - 润富黄金回收
  • 2026年驻马店市黄金回收白银回收铂金回收彩金回收 地址联系大全+支持现场结算无套路 - 前途无量YY
  • chrome-mcp注意点Use a different `userDataDir` or stop the running browser first
  • 2026年长春市黄金回收白银回收铂金回收彩金回收 地址联系大全+支持现场结算无套路 - 前途无量YY
  • 保姆级教程:在RK3568开发板上搞定广和通FG650 5G模组(从驱动修改到自动拨号)
  • 2026年成都蟑螂防治亲测有效品牌推荐 - 优质品牌推荐商
  • Unity游戏马赛克移除技术架构与工程化实现方案
  • 保姆级教程:用STM32CubeMX和HAL库搞定ADC采集光照传感器(附完整代码)
  • 遗传算法工程化落地:编码策略、算子设计与收敛诊断实战
  • 2026年安徽省初中考不上高中有哪些学校可以选择?最新择校指南 - 我叫小周
  • 大模型训练数据自动化生成与质量控制实践
  • 2026双鸭山本地企业认可的 5 家电能质量评估服务机构实地测评汇总 - 中检检测集团
  • 闲置黄金变现最佳时机 2026鄂州黄金计价与正规回收盘点 - 润富黄金回收
  • 仙踪问道 GEO MCP:让内容被生成式 AI 主动引用的实战指南
  • 2026四川市民高频选择的 5 家实体水质检测饮用水检测井水检测第三方实地测评整理 - 诚金汇钻回收公司
  • 专升本语文作文题目|语文作文|资料已整理
  • OpenGL透视与平行投影实战:用FreeGLUT和C++手把手教你绘制3D立方体(附完整代码)
  • 【2026年6月】一次性手套独立包装厂家推荐指南 - 多才菠萝
  • ESP32玩转OLED屏?手把手教你用U8g2模拟器搞定UI布局,省下80%调试时间
  • AurigaNet:自动驾驶多任务实时感知网络架构解析
  • 【CANdelaStudio-从入门到深入到实战】10 安全访问:当ECU说“请先解锁”时,你的Seed Key算法靠谱吗?
  • 2026青岛市民高频选择的 5 家实体水质检测饮用水检测井水检测第三方实地测评整理 - 诚金汇钻回收公司
  • 告别简历“石沉大海”:5款AI工具助你打造一份会“呼吸”的精准简历