给定一个仅包含 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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61object MaximalRectangle {
def main(args: Array[String]): Unit = {
val arr1 = Array(
Array('0', '1'),
Array('1', '0')
)
println(maximalRectangle(arr1))
val arr = 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')
)
println(maximalRectangle(arr))
}
def maximalRectangle(matrix: Array[Array[Char]]): Int = {
if (matrix.length == 0) return 0
val dp = new Array[Int](matrix(0).length)
var maxArea = 0
for (i <- 0 until matrix.length) {
for (j <- 0 until matrix(i).length) {
if (matrix(i)(j) == '1') dp(j) = dp(j) + 1 else dp(j) = 0
}
maxArea = Math.max(maxArea, largestRectangleArea3(dp))
}
maxArea
}
def largestRectangleArea3(height: Array[Int]): Int = {
if (height.length == 0) return 0
var list: List[Int] = height.toList
val heights = new ListBuffer[Int]()
heights ++= list
heights += 0
var res = 0
val st = new java.util.Stack[Int]()
var i = 0
while (i < heights.length) {
if (st.isEmpty || heights(i) > heights(st.peek())) {
st.push(i)
i += 1
} else {
val curr = st.peek()
st.pop()
val area = heights(curr) * (if (st.isEmpty()) i else (i - 1 - st.peek()))
res = Math.max(res, area)
}
}
res
}
}