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

面试算法40:矩阵中的最大矩形

题目

请在一个由0、1组成的矩阵中找出最大的只包含1的矩形并输出它的面积。例如,在图6.6的矩阵中,最大的只包含1的矩阵如阴影部分所示,它的面积是6。
在这里插入图片描述

分析

直方图是由排列在同一基线上的相邻柱子组成的图形。由于题目要求矩形中只包含数字1,因此将矩阵中上下相邻的值为1的格子看成直方图中的柱子。如果分别以图6.6中的矩阵的每行为基线,就可以得到4个由数字1的格子组成的直方图,如图6.7所示。
在这里插入图片描述

在将矩阵转换成多个直方图之后,就可以计算并比较每个直方图的最大矩形面积,所有直方图中的最大矩形也是整个矩阵中的最大矩形。例如,图6.7(c)的直方图中的最大矩形(阴影部分)也是图6.6中矩阵的最大矩形。

public class Test {public static void main(String[] args) {char[][] matrix = {{'1', '0', '1', '0', '0' },{'0', '0', '1', '1', '1' },{'1', '1', '1', '1', '1' },{'1', '0', '0', '1', '0' }};int result = maximalRectangle(matrix);System.out.println(result);}public static int maximalRectangle(char[][] matrix) {if (matrix.length == 0 || matrix[0].length == 0) {return 0;}int[] heights = new int[matrix[0].length];int maxArea = 0;for (char[] row : matrix) {for (int i = 0; i < row.length; i++) {if (row[i] == '0') {heights[i] = 0;}else {heights[i]++;}}maxArea = Math.max(maxArea, largestRectangleArea(heights));}return maxArea;}public static int largestRectangleArea(int[] heights) {Stack<Integer> stack = new Stack<>();stack.push(-1);int maxArea = 0;for (int i = 0; i < heights.length; i++) {while (stack.peek() != -1 && heights[stack.peek()] >= heights[i]) {int height = heights[stack.pop()];int width = i - stack.peek() - 1;maxArea = Math.max(maxArea, height * width);}stack.push(i);}while (stack.peek() != -1) {int height = heights[stack.pop()];int width = heights.length - stack.peek() - 1;maxArea = Math.max(maxArea, height * width);}return maxArea;}
}
http://www.lryc.cn/news/209880.html

相关文章:

  • was下log4j设置日志不输出问题
  • 小米14系列, OPPO Find N3安装谷歌服务框架,安装Play商店,Google
  • Servlet 与Spring对比!
  • 粤嵌实训医疗项目--day03(Vue + SpringBoot)
  • spark3.3.x处理excel数据
  • 哪一个更好?Spring boot还是Node.js
  • AD7321代码SPI接口模数转换连接DAC0832输出verilog
  • JavaScript_Pig Game切换当前玩家
  • EtherNet Ip工业RFID读写器与欧姆龙PLC 配置示例说明
  • UE5简化打包大小
  • ThinkPHP8学习笔记
  • NSSCTF做题第9页(2)
  • Rust笔记【1】
  • 代码随想录训练营day3:链表part1
  • Bootstrap的咖啡网站实例代码阅读笔记
  • 2021年06月 Python(二级)真题解析#中国电子学会#全国青少年软件编程等级考试
  • FileWriter文件字符输出流
  • Vue的八个基础命令及作用
  • Log日志详解分析
  • 【API篇】九、Flink的水位线
  • #经典论文 异质山坡的物理模型 2 有效导水率
  • Java面试题-Redis-第一天(Redis简单介绍)
  • Java 生成和读取JSON文件
  • k8s-----26、细粒度权限管理 RBAC
  • 【Unity ShaderGraph】| 制作一个 高级流体水球效果
  • 日常软件游戏丢失msvcp120dll怎么修复?分享5个修复方法
  • 自动驾驶之—2D到3D升维
  • ubuntu18.4(后改为20.4)部署chatglm2并进行基于 P-Tuning v2 的微调
  • 爬虫-获取数据xpath
  • SpringBoot中使用JdbcTemplate访问Oracle数据库