leetcode每日解題思路 221 Maximal Square

問題描述:學習

題目連接: 221 Maximal Square3d

問題找解決的是給出一個M*N的矩陣, 只有'1', '0',兩種元素; 須要你從中找出 由'1'組成的最大正方形。恩, 就是這樣。code

咱們看到, 這道題目的標籤仍是DP, 那麼問題的關鍵就是要找到一個符合判斷是否爲正方形的遞推式。blog

 

  老套路, 先看基本型, 對於一個2*2的正方形,對於右下角的元素(1,1)而言, 他的上(0,1), 左(1,0), 左上(0,0)三個元素應該都是'1',leetcode

如此纔可以組成一個合規的正方形; 那麼若是是一個3*3呢, 首先他必然是一個2*2, 而後左加一列,上添一行,就由一個2*2成了一個3*3型,因此, 對於在矩陣中的get

任意一個點'1'只要不斷匹配他的左邊列和上邊行都是‘1’, 並計數後再往外匹配一層,知道出現'0'或者到達邊界便可, 而後從每一個點中選出匹配到的最大層數, done!im

  基本套路就是如此, 可是每一個點都走一遍就是M*N個點, 後每一個點都再外面一層逐個匹配, 時間複雜度消耗不起,O(M^2*N^2), 通常考慮M*N,直接近似4次方的複雜度,d3

確定不可取。既然從後往前不靠譜, 那咱們從前日後推又如何呢?top

  除去邊界(即第一行與第一列),對於任意一個matrix[i][i],他所處的方形應該前一層決定:左邊(matrix[i][j-1]), 上邊(matrix[i-1][j]),左上(matrix[i-1][j-1])決定,img

一樣的, 咱們也須要一個結果矩陣 ret[M][N] 記錄每一個對應點所處的方形層數。

  再看最基本型:對於在matrix[1][1]出的點, 他的左上外層全爲'1', 故這個點在ret[1][1]就+1,結果記爲2,

即:if: (top != '0', left!='0', top_left!='0')

  then: ret[i][j] = matrix[i][j]+1;

  在考慮到這一步的時候, 以爲已經ok了, 馬上在頁面寫好代碼提交, 結果倒是一個大大的Wrong Answer! 當下以爲沒錯啊, 對於每一個點是否是處於方形都作了

判斷, 並且斷定了以後還把層數+1嘞,因而輸出結果矩陣一看:

  

很明顯, 對於層數計算, 並無獲取前一層的都處於的方形層數, 要知道,假設在[i][j]爲止是屬於3*3的方形, 那麼必然有點[i-1][j],[i][j-1], [i-1][j-1]這3個都至少屬於

2*2的方形, 可能用圖示更清楚:

  left:top:left_top:

因此上面的情形若是在遞推產生的ret矩陣中就是這個樣子:

    left:top:left_top:

 

因此, 更正後的遞推式應該是:

  

再次提交, Accepted!

最後只解決的代碼:

  

 

  另外, 還有一道相近的連接在這裏), 此次不定形狀了, 你是一行, 仍是正方形沒有限制了, 難度也提高爲Hard級別,

但核心思想確定沒變, 各位額能夠嘗試下, 此題明後日貼我的解決思路。

  最後仍是老話, 本人貼上來的解法和思路僅做是記錄,或者還能夠向各位看官交流學習,有幫助就好。

相關文章
相關標籤/搜索