1. 题意

这是LeetCode上的 [040,矩阵中最大的矩形],难度为 [困难]

2. 思路分析

这道题跟上一题一样还是求最大矩形的面积,所以求最大矩形的面积可以参考直方图的最大矩形面积,那么这道题的关键在于从矩阵中找出所有的直方图,然后再从所以直方图中找到最大的矩形

直方图是由排列在同一基线上的相邻柱子组成的的图形,题意要求矩形中只包含数字1,那么可以把矩阵中上下相邻的值为1的格子看成是一个柱子,因此可以把矩阵中的每一行看作基线,这样矩阵有多少行就有多少个直方图,直方图最大的矩形即为解的答案

需要注意的是每一行组合而成的直方图的每个柱子的高度实在下面两种情况得出的

  • 若柱子的高度为1,则它的实际高度是在上一行相同列的柱子高度加1得到的
  • 若柱子的高度为0,则它的实际高度为0

例如如下图所示的矩阵,如果分别以矩阵的每行为基线,就可以得到4个由数字1组成的直方图

以矩阵第一行为基线的直方图,如下所示

以矩阵第二行为基线的直方图,柱子的高度是在第一行高度的基础上累加起来的,例如第二行的第三列的值1,而它上一行的同一列的柱子高度为1,因此它的柱子高度为1+1=2,如下所示


以矩阵第三行为基线的直方图,柱子的高度是在第二行高的基础累加的,例如第三行的第三列的值为1,而它上一行的相同列的高度为2,因此它的高度为2 + 1 = 3

它的最大矩形也是整个矩阵中只包含1的最大矩形,如阴影部分显示

以矩形第4行为基线的直方图,柱子的高度计算跟前面是一样的,如下所示

2.1 代码实现

class Solution {public int maximalRectangle(String[] matrix) {// 若数组长度为0,则矩阵是空的,返回0if (matrix.length == 0) {return 0;}// 创建一个柱子数组,存放直方图每个柱子的高度,长度为字符串的长度int[] heights = new int[matrix[0].length()];// 记录每个直方图最大的矩形面积int maxArea = 0;// 嵌套遍历,获取数组每个字符串的每个字符for (String rows : matrix) {for (int i = 0; i < rows.length(); i++) {// 若当前字符为0,则柱子的高度为0if (rows.charAt(i) == '0') {heights[i] = 0;} else {// 否则字符为1,则柱子的高度是在上一行同一列的柱子的高度累加的heights[i]++;}}maxArea = Math.max(maxArea, largestRectangleArea(heights));}return maxArea;}public int largestRectangleArea(int[] heights) {// 创建一个栈存放递增的柱子Deque<Integer> stack = new LinkedList<>();// 压入一个-1的下标,用来处理栈顶左侧没有柱子的情况stack.push(-1);// 记录最大矩形面积int maxArea = 0;// 遍历数组for (int i = 0; i < heights.length; i++) {// 若栈有柱子元素(-1是想象虚拟的柱子),并且栈顶元素大于当前遍历的柱子高度执行逻辑while (stack.peek() != -1 && heights[stack.peek()] >= heights[i]) {// 弹出栈顶元素,计算栈顶元素的最大矩形面积int height = heights[stack.pop()];int width = i - stack.peek() - 1;maxArea = Math.max(height * width, maxArea);}stack.push(i);}// 遍历完数组后,栈可能还有柱子的执行逻辑while (stack.peek() != -1) {int height = heights[stack.pop()];int width = heights.length - stack.peek() - 1;maxArea = Math.max(height * width, maxArea);}return maxArea;}
}

2.2 复杂度分析

假设输入的矩阵大小为m x n,则该矩阵可以转换成m个直方图

时间复杂度

采用单调栈法求直方图的最大面积的时间复杂度为O(n),由于由m个直方图,故总的时间复杂度为O(m x n)

空间复杂度

同样地,单调栈法的空间复杂度为O(n),还需要一个长度为n的数组height,故总的空间复杂度为O(n)

算法学习——剑指 Offer II 040. 矩阵中最大的矩形(Java实现)相关推荐

  1. 剑指 Offer II 014. 字符串中的变位词

    剑指 Offer II 014. 字符串中的变位词 题目 示例 解答 题目来源为leetcode 题目 给定两个字符串s1和s2,写一个函数来判断s2是否包含s1的某个变位词. 换句话说,第一个字符串 ...

  2. 【牛客 - 剑指offer】JZ12 矩阵中的路径 深度优先搜索DFS Java实现

    文章目录 剑指offer题解汇总 Java实现 本题链接 题目 题目主要信息 方案 深度优先搜索 剑指offer题解汇总 Java实现 https://blog.csdn.net/guliguligu ...

  3. 矩阵每一行重复_【剑指offer】65 矩阵中的路径

    - 题目描述 请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径.路径可以从矩阵中的任意一个格子开始,每一步可以在矩阵中向左,向右,向上,向下移动一个格子.如果一条路径经过了矩 ...

  4. 剑指Offer对答如流系列 - 矩阵中的路径

    文章目录 面试题11:矩阵中的路径 一.题目描述 二.问题分析 三.实现 四.探讨 解空间 (1)子集树 (2)排列树 面试题11:矩阵中的路径 一.题目描述 请设计一个函数,用来判断在一个矩阵中是否 ...

  5. 【算法】剑指 Offer II 079. 所有子集|78. 子集(java / c / c++ / python / go / rust)

    非常感谢你阅读本文~ 欢迎[

  6. 剑指 Offer II 028. 数组中出现次数超过一半的数字

    注:本文的代码实现使用的是 JS(JavaScript),为前端中想使用JS练习算法和数据结构的小伙伴提供解题思路. 描述 给一个长度为 n 的数组,数组中有一个数字出现的次数超过数组长度的一半,请找 ...

  7. 【算法】剑指 Offer 56 - I. 数组中数字出现的次数 【重刷】太难了

    1.概述 一个整型数组 nums 里除两个数字之外,其他数字都出现了两次.请写程序找出这两个只出现一次的数字.要求时间复杂度是O(n),空间复杂度是O(1). 示例 1: 输入:nums = [4,1 ...

  8. 【算法】剑指offer - JZ76 删除链表中重复的结点

    题目链接 在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针. 分析 1.确定去重的范围,采用 前开后闭 的方法. 2.增加一个头结点,统一操作. (pre ...

  9. 剑指 Offer II 076. 数组中的第 k 大的数字

    题目 给定整数数组 nums 和整数 k,请返回数组中第 k 个最大的元素. 请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素. 示例 输入: [3,2,1,5,6,4 ...

最新文章

  1. esriFeatureType与esriGeometryType的区别与联系
  2. 文本基线怎样去掉_ICML 2020 | 基于类别描述的文本分类模型
  3. 哈哈,我的Blog开通了。。。
  4. 百一测评java基础答案_百一测评——《Web应用开发》选择题(含参考答案)—JavaEE基础...
  5. c语言100位整数乘法,很大的数相乘怎么办?
  6. [vue] 为什么我们写组件的时候可以写在.vue里呢?可以是别的文件名后缀吗?
  7. C++ Vector 汇总
  8. 终端实体店消费者喜爱的营销方式
  9. 华为太极magisk安装教程_华为(HUAWEI)ROM安装包合集
  10. 最新github clone方法
  11. speedoffice(Excel)如何隐藏编辑栏
  12. mysql经纬度查范围内_sql语句查询经纬度范围
  13. python模拟键盘上键和回车_使用Python模拟键盘输入
  14. sql sever conver
  15. windows下VS中各种C++库的集成
  16. IOS 16 UITabBarItem设置字体属性崩溃
  17. 项目管理-5大过程组-10大知识领域-47过程
  18. 在c语言中有逻辑型变量吗,【判断题】在C语言中,虽然有逻辑运算,但没有逻辑型变量....
  19. Docker安装Mysql8、并打成镜像在其他内网环境部署
  20. 使用Spark分析拉勾网招聘信息(三): BMR 入门

热门文章

  1. UE4特效萌新上手笔记- 从Houdini到Niagara的基本工作流程
  2. Mysql全套看这一篇就够了特别详细
  3. introduction to data oriented design
  4. 单片机反相器_基于AT89S52单片机的新型智能家居安防系统
  5. 棋牌行业开年第一站,阿里游戏云与你聊安全
  6. C语言-快速排序算法(递归Hoare版)
  7. 凯文·凯利对人工智能的思考与我的理解
  8. rebar3 自定义编译插件攻略
  9. 混沌神经网络(Chaos Neural Network)
  10. SpringBoot项目集成全文搜索引擎Elasticsearch