1. 程式人生 > >leetCode最大正方形

leetCode最大正方形

在一個由 0 和 1 組成的二維矩陣內,找到只包含 1 的最大正方形,並返回其面積。

示例:

輸入: 

1 0 1 0 0
1 0 1 1 1
1 1 1 1 1
1 0 0 1 0

輸出: 4

動態規劃:三要素

最優子結構:當判斷一個為1的點所組成的最大正方形時,把他當做正方形的右下點,如果他的左,上,左上都是一個正方形的右下頂點,那麼這個正方形的邊長就+1

邊界:邊界為第一行,第一列

狀態轉移方程:temp陣列儲存這個點所組成最大正方形的邊長,temp[i][j]=min(temp[i-1][j], temp[i][j], temp[i-1][j-1])

    public int maximalSquare(char[][] matrix) {
        int m = matrix.length;
        if(m == 0) return 0;
        int n = matrix[0].length;
        int max = 0;
        int[][] temp = new int[m][n];
        //第一列
        for(int i = 0; i < m; i++) {
        	temp[i][0] = matrix[i][0] - '0';
        	max = Math.max(max, temp[i][0]);
        }
        //第一行
        for(int i = 0; i < n; i++) {
        	temp[0][i] = matrix[0][i] - '0';
        	max = Math.max(max, temp[0][i]);
        }
        //遍歷
        for(int i = 1; i < m; i++) {
        	for(int j = 1; j < n; j++) {
        		temp[i][j] = matrix[i][j] == '1' ? Math.min(temp[i-1][j-1],Math.min(temp[i-1][j], temp[i][j-1])) + 1 : 0;
        		max = Math.max(max, temp[i][j]);
        	}        	
        }
        return max * max;
    }