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){
}
'PS > LeetCode' 카테고리의 다른 글
871. Minimum Number of Refueling Stops - Streak 19 (0) | 2025.10.02 |
---|---|
410. Split Array Largest Sum - Streak 17 (0) | 2025.09.30 |
84. Largest Rectangle in Histogram - Streak 16 (0) | 2025.09.29 |
212. Word Search II - Streak 15 (0) | 2025.09.28 |
76. Minimum Window Substring - Streak 14 (0) | 2025.09.27 |