85 Maximal rectangle

https://leetcode.com/problems/maximal-rectangle/

čŋ™é“éĸ˜įŽ—æ¯čĄŒæœ€å¤§éĸį§¯į”¨å•č°ƒæ ˆäŧšåŋĢ垈多

class Solution {
    public int maximalRectangle(char[][] matrix) {
        int m = matrix.length;
        int n = matrix[0].length;
        int[][] dp = new int[m][n];
        for (int i = 0; i < m; i++) {
            for (int j = 0; j < n; j++) {
                if (matrix[i][j] == '1') {
                    if (i == 0) {
                        dp[i][j] = 1;
                    } else {
                        dp[i][j] = dp[i-1][j] + 1;
                    }
                }
            }
        }
        int ans = 0;
        for (int i = 0; i < m; i++) {
            int[] heights = dp[i];
            ans = Math.max(ans, getMax(heights));
        }
        return ans;
    }
    
    private int getMax(int[] heights) {
        int ans = 0;
        int n = heights.length;
        int[] arr = new int[n+2];
        Deque<Integer> stack = new ArrayDeque<>();
        for (int i = 0; i < n; i++) {
            arr[i+1] = heights[i];
        }
        stack.push(0);
        for (int i = 1; i <= n + 1; i++) {
            if (arr[stack.peek()] <= arr[i]) {
                stack.push(i);
            } else {
                while (arr[stack.peek()] > arr[i]) {
                    int curidx = stack.pop();
                    int curhei = arr[curidx];
                    ans = Math.max(ans, curhei*(i-stack.peek()-1));
                }
                stack.push(i);
            }
        }
        return ans;
    }
}

Last updated