85-最大矩阵

题目

给定一个仅包含 0 和 1 、大小为 rows x cols 的二维二进制矩阵,找出只包含 1 的最大矩形,并返回其面积。

示例 1:

输入:matrix = [["1","0","1","0","0"],["1","0","1","1","1"],["1","1","1","1","1"],["1","0","0","1","0"]]

输出:6

解释:最大矩形如上图所示。

示例 2:

输入:matrix = []

输出:0

示例 3:

输入:matrix = [["0"]]

输出:0

示例 4:

输入:matrix = [["1"]]

输出:1

示例 5:

输入:matrix = [["0","0"]]

输出:0

思路

最大矩形面积问题可以使用栈来解决,结合柱状图的特性。下面我将详细解释解题思路,并提供关键算法和算法思想的说明。

解题思路:

对于每一行,我们可以将每个元素的值视为当前位置向上的高度。我们可以根据每一行的高度构建一个柱状图,然后使用栈来计算柱状图中的最大矩形面积。

  1. 对于每一行,我们构建一个高度数组 heights,其中 heights[j] 表示从当前行的第 j 列向上的连续 1 的数量。我们可以根据上一行的高度数组和当前行的元素来更新这个数组。

  2. 对于 heights 数组,我们使用栈来辅助计算最大矩形面积。我们遍历 heights 数组,如果当前高度大于栈顶高度,就将当前索引入栈。否则,我们弹出栈顶索引,并计算以该高度为高的矩形面积,宽度为当前索引与弹出索引之间的距离。我们不断更新最大面积,直到栈为空或者当前高度大于栈顶高度。

关键算法和算法思想:

栈是解决这个问题的关键算法思想。通过使用栈,我们可以维护一个递增的高度序列,当遇到下降的高度时,我们可以计算以当前高度为高的矩形面积,利用栈中保存的索引信息。

代码

scala 复制代码
object Solution {
    def maximalRectangle(matrix: Array[Array[Char]]): Int = {
        if (matrix.isEmpty) return 0
        
        val rows = matrix.length
        val cols = matrix(0).length
        var maxArea = 0
        val heights = Array.fill(cols)(0)
        
        def largestRectangleArea(heights: Array[Int]): Int = {
            val stack = collection.mutable.Stack[Int]()
            var maxArea = 0
            
            for (i <- 0 until heights.length) {
                while (stack.nonEmpty && heights(i) < heights(stack.top)) {
                    val height = heights(stack.pop())
                    val width = if (stack.isEmpty) i else i - stack.top - 1
                    maxArea = math.max(maxArea, height * width)
                }
                stack.push(i)
            }
            
            while (stack.nonEmpty) {
                val height = heights(stack.pop())
                val width = if (stack.isEmpty) heights.length else heights.length - stack.top - 1
                maxArea = math.max(maxArea, height * width)
            }
            
            maxArea
        }
        
        for (i <- 0 until rows) {
            for (j <- 0 until cols) {
                if (matrix(i)(j) == '1') heights(j) += 1
                else heights(j) = 0
            }
            maxArea = math.max(maxArea, largestRectangleArea(heights))
        }
        
        maxArea
    }
}

// 示例
val matrix = Array(
    Array('1','0','1','0','0'),
    Array('1','0','1','1','1'),
    Array('1','1','1','1','1'),
    Array('1','0','0','1','0')
)
val result = Solution.maximalRectangle(matrix)
println(result) // 输出:6
相关推荐
雾月5517 分钟前
LeetCode 1292 元素和小于等于阈值的正方形的最大边长
java·数据结构·算法·leetcode·职场和发展
OpenC++1 小时前
【C++QT】Buttons 按钮控件详解
c++·经验分享·qt·leetcode·microsoft
知来者逆2 小时前
计算机视觉——速度与精度的完美结合的实时目标检测算法RF-DETR详解
图像处理·人工智能·深度学习·算法·目标检测·计算机视觉·rf-detr
阿让啊2 小时前
C语言中操作字节的某一位
c语言·开发语言·数据结构·单片机·算法
এ᭄画画的北北2 小时前
力扣-160.相交链表
算法·leetcode·链表
爱研究的小陈3 小时前
Day 3:数学基础回顾——线性代数与概率论在AI中的核心作用
算法
渭雨轻尘_学习计算机ing3 小时前
二叉树的最大宽度计算
算法·面试
BB_CC_DD4 小时前
四. 以Annoy算法建树的方式聚类清洗图像数据集,一次建树,无限次聚类搜索,提升聚类搜索效率。(附完整代码)
深度学习·算法·聚类
梁下轻语的秋缘5 小时前
每日c/c++题 备战蓝桥杯 ([洛谷 P1226] 快速幂求模题解)
c++·算法·蓝桥杯
CODE_RabbitV5 小时前
【深度强化学习 DRL 快速实践】逆向强化学习算法 (IRL)
算法