PS/LeetCode
85. Maximal Rectangle - Streak 18
조금씩 차근차근
2025. 10. 1. 08:59
row, cols <= 200 이기 때문에,
O(n^3)만 되도 1초 안에 해결 가능하다.
그렇지만 그저께 풀었던 문제를 이용하면, O(n^2)만에 가장 큰 직사각형 넓이를 구할 수 있다.
84. Largest Rectangle in Histogram - Streak 16
그리디하게 스위핑하는 아이디어가 떠오른다. 스택으로 높은 박스를 추가하면서, 계속 세지 말고, 스택에서 pop할때만 넓이를 계산하면 된다. 그렇다면 왼쪽 끝의 기준을 어떻게 잡아야 할까? 이
dev.go-gradually.me
class Solution {
public int maximalRectangle(char[][] matrix) {
int n = matrix.length;
int m = matrix[0].length;
int[][] psum = new int[n][m];
for(int j = 0; j<m; j++){
psum[0][j] = matrix[0][j] - '0';
for(int i = 1; i<n; i++){
psum[i][j] = matrix[i][j] == '1' ? psum[i-1][j] + 1 : 0;
}
}
int ret = 0;
for(int i = 0; i<n; i++){
Deque<Tuple> stk = new ArrayDeque<>();
for(int j = 0; j<m; j++){
int leftEnd = j;
while(!stk.isEmpty() && stk.getLast().height() >= psum[i][j]){
Tuple before = stk.removeLast();
leftEnd = before.index();
ret = Math.max(ret, (j - leftEnd)*before.height());
}
stk.addLast(new Tuple(psum[i][j], leftEnd));
}
while(!stk.isEmpty()){
Tuple before = stk.removeLast();
ret = Math.max(ret, (m - before.index())*before.height());
}
}
return ret;
}
}
record Tuple(int height, int index){
}