LintCode Maximal Square

Given a 2D binary matrix filled with 0's and 1's, find the largest square containing all 1's and return its area.

樣例
For example, given the following matrix:

1 0 1 0 0
1 0 1 1 1
1 1 1 1 1
1 0 0 1 0
Return 4.

解題思路
初始思路是判斷對(duì)角方向以及相鄰的兩個(gè)數(shù),運(yùn)行結(jié)果錯(cuò)誤,然后查看錯(cuò)誤發(fā)現(xiàn)需要判斷整個(gè)鄰邊,因此想到遍歷鄰邊判斷(i,j)位置的最大面積。但是會(huì)發(fā)現(xiàn)(i,j)之前的點(diǎn)的結(jié)果已經(jīng)得出,為什么會(huì)重復(fù)用到之前的點(diǎn),整個(gè)過程應(yīng)該可以優(yōu)化。思考后想到了同時(shí)三個(gè)方向判斷,因此得出轉(zhuǎn)移方程:maxArea[i][j] = Math.min(maxArea[i][j - 1],Math.min(maxArea[i - 1][j - 1], maxArea[i - 1][j])) + 1;

錯(cuò)誤代碼

    if(matrix[i - 1][j] == 1 && matrix[i][j - 1] == 1 && matrix[i - 1][j - 1] == 1)
    {
           maxArea[i][j] = maxArea[i - 1][j - 1] + 1;
       if(maxArea[i][j] > maxResultArea)
       {
              maxResultArea = maxArea[i][j];
       }
    }           

正確代碼

public class Solution {
    /**
     * @param matrix: a matrix of 0 and 1
     * @return: an integer
     */
  public int maxSquare(int[][] matrix) {
        if(null == matrix)
        {
            return 0;
        }
        int row = matrix.length;
        if(row <= 0)
        {
            return 0;
        }
        int col = matrix[0].length;
        int[][] maxArea = new int[row][col];
        int maxResultArea = Integer.MIN_VALUE;
        
        for(int i = 0;i < row;i++)
        {
            maxArea[i][0] = matrix[i][0];
            if(maxArea[i][0] > maxResultArea)
            {
                maxResultArea = maxArea[i][0];
            }
        }
        
        for(int i = 0;i < col;i++)
        {
            maxArea[0][i] = matrix[0][i];
            if(maxArea[0][i] > maxResultArea)
            {
                maxResultArea = maxArea[0][i];
            }
        }
        
        for(int i = 1;i < row;i++)
        {
            for(int j = 1;j < col;j++)
            {
                if(matrix[i][j] == 1)
                {
                    maxArea[i][j] = Math.min(maxArea[i][j - 1],Math.min(maxArea[i - 1][j - 1], maxArea[i - 1][j])) + 1;
                }
                if(maxArea[i][j] > maxResultArea)
                {
                    maxResultArea = maxArea[i][j];
                }
            }
        }
        return maxResultArea > 0 ?  maxResultArea * maxResultArea : 0;
    }
}

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 背景 一年多以前我在知乎上答了有關(guān)LeetCode的問題, 分享了一些自己做題目的經(jīng)驗(yàn)。 張土汪:刷leetcod...
    土汪閱讀 12,899評(píng)論 0 33
  • 動(dòng)態(tài)規(guī)劃(Dynamic Programming) 本文包括: 動(dòng)態(tài)規(guī)劃定義 狀態(tài)轉(zhuǎn)移方程 動(dòng)態(tài)規(guī)劃算法步驟 最長(zhǎng)...
    廖少少閱讀 3,641評(píng)論 0 18
  • 【程序1】 題目:古典問題:有一對(duì)兔子,從出生后第3個(gè)月起每個(gè)月都生一對(duì)兔子,小兔子長(zhǎng)到第三個(gè)月后每個(gè)月又生一對(duì)兔...
    葉總韓閱讀 5,223評(píng)論 0 41
  • (1) 李白今年最不開心的一件事,就是自己博士延長(zhǎng)學(xué)年。 李白最幸福的一件事,也是自己博士延長(zhǎng)學(xué)年。 “師兄為什么...
    李旭洋閱讀 705評(píng)論 1 1
  • 某只海馬叫四七 2017.01.10
    昕彤47閱讀 221評(píng)論 0 0

友情鏈接更多精彩內(nèi)容