C 實現LeetCode 85 最大矩形

2022-09-24 22:24:10 字數 2470 閱讀 6557

given a 2d binary matrix filled with 0's and 1's, find the largest rectangle containing only 1's and return its area.

example:

input:

[["1","0","1","0","0"],

["1","0","1","1","1"],

["1","1","1","1","1"],

["1","0","0","1","0"]

]output: 6

此題是之前那道的 largest rectangle in histogram 的擴充套件,這道題的二維矩陣每一層向上都可以看做乙個直方圖,輸入矩陣有多少行,就可以形成多少個直方圖,對每個直方圖都呼叫 largest rectangle in histogram 中的方法,就可以得到最大的矩形面積。那麼這道題唯一要做的就是將每一層都當作直方圖的底層,並向上構造整個直方圖,由於題目限定了輸入矩陣的字元只有 '0' 和 '1' 兩種,所以處理起來也相對簡單。方法是,對於每乙個點,如果是 『0',則賦0,如果是 『1',就賦之前的 heightpftymmz 值加上1。具體參見**如下:

解法一:

class solution

res = max(res, largestrectanglearea(height));

}return res;

}int largestrectanglearea(vector& height)

}return res;}};

我們也可以在乙個函式內完成,這樣**看起來更加簡潔一些,注意這裡的 height 初始化的大小為 n+1,為什麼要多乙個呢?這是因為我們只有在當前位置小於等於前乙個位置的高度的時候,才會去計算矩形的面積,假如最後乙個位置的高度是最高的,那麼我們就沒法去計算並更新結果 res 了,所以要在最後再加乙個高度0,這樣就一定可以計算前面的矩形面積了,這跟上面解法子函式中給 height 末尾加乙個0是一樣的效果,參見**如下:

解法二:

class solution

while (!s.empty() && height[s.top()] >= height[j])

s.push(j);}}

return res;}};

下面這種方法的思路很巧妙,height 陣列和上面一樣,這裡的 left 陣列表示若當前位置是1且與其相連都是1的左邊界的位置(若當前 height 是0,則當前 left 一定是0),right 陣列表示若當前位置是1且與其相連都是1的右邊界的位置再加1(加1是為了計算長度方便,直接減去左邊界位置就是長度),初始化為n(若當前 height 是0,則當前 right 一定是n),那麼對於任意一行的第j個位置,矩形為 (right[j] - left[j]) * height[j],我們舉個例子來說明,比如給定矩陣為:

[ [1, 1, 0, 0, 1], [0, 1, 0, 0, 1], [0, 0, 1, 1, 1], [0, 0, 1, 1, 1], [0, 0, 0, 0, 1] ]第0行:

h: 1 1 0 0 1

l: 0 0 0 0 4

r: 2 2 5 5 5

第1行:

h: 0 2 0 0 2

l: 0 1 0 0 4 

r: 5 2 5 5 5

第2行:

h: 0 0 1 1 3

l: 0 0 2 2 4 

r: 5 5 5 5 5

第3行:

h: 0 0 2 2 4

l: 0 0 2 2 4 

r: 5 5 5 5 5

第4行:

h: 0 0 0 0 5

l: 0 0 0 0 4

r: 5 5 5 5 5

解法三:

class solution else

}for (int j = n - 1; j >= 0; --j) else

res = max(res, (right[j] - left[j]) * height[j]);}}

return res;}};

再來看一種解法,這裡我們統計每一行的連續1的個數,使用乙個陣列 h_max, 其中 h_max[i][j] 表示第i行,第j個位置水平方向連續1的個數,若 matrix[i][j] 為0,那對應的 h_max[i][j] 也一定為0。統計的過程跟建立累加和陣列很類似,唯一不同的是遇到0了要將 h_max 置0。這個統計好了之後,只需要再次遍歷每個位置,首先每個位置的 h_max 值都先用來更新結果 res,因為高度為1也可以看作是矩形,然後我們向上方遍歷,上方 (i, j-1) 位置也會有 h_max 值,但是用二者之間的較小值才能構成矩形,用新的矩形面積來更新結果 res,這樣一直向上遍歷,直到遇到0,或者是越界的時候停止,這樣就可以找出所有的矩形了,參見**如下:

解法四:

class solution

}for (int i = 0; i < m; ++i) }}

return res;}};

Leetcode 85最大矩形 C

思路 直方圖中最大矩形的延伸。這道題要將矩陣的每一行處理成和直方圖中的高度,由於題目限定了輸入矩陣的字元只有 0 和 1 兩種,所以處理起來也相對簡單。當遇到0時,將高度設為0,當遇到1時,加上上一層對應位置處的高度即可。class solution res max res,largestrecta...

Leetcode 85 最大矩形 C

給定乙個僅包含 0 和 1 的二維二進位制矩陣,找出只包含 1 的最大矩形,並返回其面積。輸入 1 0 1 0 0 1 0 1 1 1 1 1 1 1 1 1 0 0 1 0 輸出 6此題可以用到84題的方法,我們以每行為x軸,因此轉化成84題中求最大矩形的問題,而求每行中對應的每列的1的高度,我們...

LeetCode 85 最大矩形

給定乙個僅包含 0 和 1 的二維二進位制矩陣,找出只包含 1 的最大矩形,並返回其面積。示例 輸入 1 0 1 0 0 1 0 1 1 1 1 1 1 1 1 1 0 0 1 0 輸出 6此題和上一題的擴充套件,此題給的二維矩陣的每一行向上都形成了乙個直方圖,所以二維矩陣有多少行,就有多少個直方圖...