刷題40-最大矩形面積

誰是最可愛的人發表於2020-12-13

原題連結

題目描述

給出一個只包含0和1的二維矩陣,找出最大的全部元素都是1的長方形區域,
返回該區域的面積。

示例

在這裡插入圖片描述

輸入:
matrix = [
	["1","0","1","0","0"],
	["1","0","1","1","1"],
	["1","1","1","1","1"],
	["1","0","0","1","0"]
]
輸出:6
解釋:最大矩形如上圖所示。

解析

每一層加上上面的層,將他們看作是柱狀圖。

第一層柱狀圖的高度["1","0","1","0","0"],最大面積為1;

第二層及以上柱狀圖的高度["2","0","2","1","1"],最大面積為3;

第三層及以上柱狀圖的高度["3","1","3","2","2"],最大面積為6;

第四層及以上柱狀圖的高度["4","0","0","3","0"],最大面積為4;

然後將題目轉換成求直方圖的最大面積

每遍歷一層都有一個直方圖
在這裡插入圖片描述

參考程式碼

public class Solution {
    public int maximalRectangle(char[][] matrix) {
        if (matrix.length == 0 || matrix[0].length == 0) {
            return 0;
        }
        int col = matrix.length;
        int row = matrix[0].length;
        int[] heights = new int[row];
        int ans = 0;
        for (int i = 0; i < col; i++) {
            for (int j = 0; j < row; j++) {
                // 原陣列是char型別的
                if (matrix[i][j] == '1') {
                    heights[j] += 1;
                } else {
                    heights[j] = 0;
                }
            }
            // 將每一行及上面的行,當作求解直方圖的最大矩形面積
            ans = Math.max(ans, largestRectangleArea(heights));
        }
        return ans;
    }
    
    public int largestRectangleArea(int[] heights) {
        int area = 0, n = heights.length;
        // 遍歷每個柱子,以當前柱子的高度作為矩形的高 h,
        // 從當前柱子向左右遍歷,找到矩形的寬度 w。
        for (int i = 0; i < n; i++) {
            int w = 1, h = heights[i];
            if(h==0)
                continue;
            // 從i-1到heights[]左側的邊界
            int j= i - 1;
            // 如果有柱子比當前高度矮,則迴圈中斷
            while (j >= 0 && heights[j] >= h) {
                w++;
                j--;
            }
            // 從i+1到height[]右側的邊界
            j = i + 1;
            // 如果有柱子比當前高度矮,則迴圈中斷
            while (j < n && heights[j] >= h) {
                w++;
                j++;
            }
            area = Math.max(area, w * h);
        }
        return area;
    }   
}

相關文章