1. 程式人生 > >LeetCode85最大矩形

LeetCode85最大矩形

題目描述

給定一個僅包含 0 和 1 的二維二進位制矩陣,找出只包含 1 的最大矩形,並返回其面積。

示例:

輸入:
[
  ["1","0","1","0","0"],
  ["1","0","1","1","1"],
  ["1","1","1","1","1"],
  ["1","0","0","1","0"]
]
輸出: 6

解題思路

思路一:暴力法

一行一行的遍歷陣列,維護每個位置到頂部的高度,如果某位置高度大於0,就往回掃描到首列,同時維護一個當前最低的高度,這樣就可以求出從這個位置到第一列的最大面積了。時間複雜度是 O

( m n 2 ) O(mn^2) ,當然通過轉置可以優化到 O (
m n m i n ( m , n
) ) O(m*n* min(m, n))
,但數量級不變。

思路二:動態規劃法

由於在暴力列舉法中我們每碰到一個高度不為0的情況就往左搜尋找到當前最低的高度然後更新面積,所以會導致重複計算。動態規劃剛好可以通過記錄原有資訊來避免重複搜尋。那麼每一行我們需要記錄什麼呢?我們需要記錄並維護的就是一行中每個位置高度的左右邊界。

思路三:遞增棧法

主要是分為兩步,第一步是將原始輸入做一下對映。

對每一行做轉換,本例中原始輸入可轉換為:

[
  ["1","0","1","0","0"],
  ["2","0","2","1","1"],
  ["3","1","3","2","2"],
  ["4","0","0","3","0"]
]

每個元素的值 = 該值按列向上遍歷,遇到非0元素的個數和(包含自身)

然後對每一行輸入使用第84題中的解題方法求出最大矩形,最後求所有行的最大矩形面積即可。