leetcode221最大正方形

leetcode221 Maximal Square

Posted by BY on May 5, 2019

前言

新的一年,好好学习。

正文

问题来源

本问题来自leetcode上的221题。

问题描述

在一个由 0 和 1 组成的二维矩阵内,找到只包含 1 的最大正方形,并返回其面积。

示例 1:

输入: 

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

输出: 4

分析:

思想和我去年做的leetcode85一致。

func max_f(a, b int) int {
    if a > b {
        return a
    }
    return b
}

func min_f(a, b int) int {
    if a < b {
        return a
    }
    return b
}

func maximalSquare(matrix [][]byte) int {
    
    rlen := len(matrix)
    if rlen == 0 {
        return 0
    }
    clen := len(matrix[0])
    height := make([]int, clen)
    left := make([]int, clen)
    right := make([]int, clen)
    for j := 0; j < clen; j++ { 
        right[j] = clen
    }
    var lstart, rstart, max int
    for i := 0; i < rlen; i++ {
        lstart, rstart = 0, clen
        for j := 0; j < clen; j++ {
            if matrix[i][j] == '0' {
                left[j] = 0
                lstart = j + 1
            } else {
                left[j] = max_f(lstart, left[j])
            }
        }
        for j := clen - 1; j >= 0; j-- {
            if matrix[i][j] == '0' {
                right[j] = clen
                rstart = j
            } else {
                right[j] = min_f(rstart, right[j])
            }
        }
        for j := 0; j < clen; j++ {
            if matrix[i][j] == '0' {
                height[j] = 0
            } else {
                height[j]++
                if height[j] <= right[j] - left[j] && height[j]*height[j] > max {
                    max = height[j]*height[j]
                }
            }
        }
    }
    return max
}

后来看到别人的解答,发现没必要弄的这么复杂

class Solution {
    public int maximalSquare(char[][] matrix) {
        /**
        dp[i][j]表示以第i行第j列为右下角所能构成的最大正方形边长, 则递推式为: 
        dp[i][j] = 1 + min(dp[i-1][j-1], dp[i-1][j], dp[i][j-1]);
        **/
        int m = matrix.length;
        if(m < 1) return 0;
        int n = matrix[0].length;
        int max = 0;
        int[][] dp = new int[m+1][n+1];
        
        for(int i = 1; i <= m; ++i) {
            for(int j = 1; j <= n; ++j) {
                if(matrix[i-1][j-1] == '1') {
                    dp[i][j] = 1 + Math.min(dp[i-1][j-1], Math.min(dp[i-1][j], dp[i][j-1]));
                    max = Math.max(max, dp[i][j]); 
                }
            }
        }
        
        return max*max;
    }
}

总结:

勤思考。

结语

不管怎么样好好加油。