14.09.26
This commit is contained in:
@@ -0,0 +1,65 @@
|
||||
Leetcode #85 | #Hard | [[Монотонный стек]] | [[Матрица]]
|
||||
## Идея
|
||||
Продолжение [[Largest Rectangle In Histogram]], но эту гистограмму надо построить. Заводим массив высот, идем по строкам. Для каждой строки обновляем массив - если в столбце 0, то ставим 0, если в столбце 1, то инкрементируем эту высоту в нашем массиве. Теперь вызываем метод из прошлой задачи на текущее состояние массива высот.
|
||||
## [[Big-O]]
|
||||
- Время ```O(NM)```
|
||||
- Память ```O(M)```
|
||||
N - кол-во строк, M - кол-во столбцов
|
||||
## Код
|
||||
```Java
|
||||
class Solution {
|
||||
public int maximalRectangle(char[][] matrix) {
|
||||
Deque<Integer> stack = new ArrayDeque<>();
|
||||
int[] heights = new int[matrix[0].length];
|
||||
int res = 0;
|
||||
|
||||
for (int r = 0; r < matrix.length; r++) {
|
||||
for (int c = 0; c < matrix[0].length; c++) {
|
||||
if (matrix[r][c] == '0') {
|
||||
heights[c] = 0;
|
||||
} else {
|
||||
heights[c] += 1;
|
||||
}
|
||||
}
|
||||
res = Math.max(res, getLargestRectangle(heights, stack));
|
||||
}
|
||||
return res;
|
||||
}
|
||||
|
||||
int getLargestRectangle(int[] heights, Deque<Integer> stack) {
|
||||
int res = 0;
|
||||
stack.clear();
|
||||
|
||||
for (int i = 0; i < heights.length; i++) {
|
||||
while (stack.size() > 0 && heights[i] < heights[stack.peek()]) {
|
||||
int height = heights[stack.pop()];
|
||||
int weight;
|
||||
|
||||
if (stack.size() == 0) {
|
||||
weight = i;
|
||||
} else {
|
||||
weight = i-stack.peek()-1;
|
||||
}
|
||||
|
||||
res = Math.max(res, height*weight);
|
||||
}
|
||||
stack.push(i);
|
||||
}
|
||||
|
||||
while (stack.size() > 0) {
|
||||
int height = heights[stack.pop()];
|
||||
int weight;
|
||||
|
||||
if (stack.size() == 0) {
|
||||
weight = heights.length;
|
||||
} else {
|
||||
weight = heights.length-stack.peek()-1;
|
||||
}
|
||||
|
||||
res = Math.max(res, height*weight);
|
||||
}
|
||||
|
||||
return res;
|
||||
}
|
||||
}
|
||||
```
|
||||
Reference in New Issue
Block a user