classSolution{ funmaximalRectangle(matrix: Array<CharArray>): Int { val m = matrix.size if (m == 0) return0 val n = matrix[0].size var maxArea = 0 val heights = IntArray(n) { 0 } for (row in0 until m) { for (col in0 until n) { if (matrix[row][col] == '1') heights[col]++ else heights[col] = 0 } val area = largestRectangleArea(heights) maxArea = maxOf(maxArea, area) } return maxArea }
privatefunlargestRectangleArea(heights: IntArray): Int { val n = heights.size var maxArea = 0 val stack = ArrayDeque<Int>() for (i in0 until n) { while (stack.isNotEmpty() && heights[i] < heights[stack.peek()]) { val height = heights[stack.pop()] val right = i val left = if (stack.isNotEmpty()) stack.peek() else -1 val width = right - left - 1 val rectArea = width * height maxArea = maxOf(maxArea, rectArea) } stack.push(i) }
// 触发末尾递增柱子的矩形面积计算 while (stack.isNotEmpty()) { val height = heights[stack.pop()] val right = n val left = if (stack.isNotEmpty()) stack.peek() else -1 val width = right - left - 1 val rectArea = width * height maxArea = maxOf(maxArea, rectArea) }