Week11

Week11

Dynamic Programming
question source: Maximal Square

question description

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

**Example **

Input
1 0 1 0 0
1 0 1 1 1
1 1 1 1 1
1 0 0 1 0
Output: 4
Explanation:

用‘1’组成的最大的正方形的面积是4.

解决方法

题目很短,就是找用‘1’所构成的正方形的最大面积是多少。
我们要用一种途径来缩小原来的问题。
现定义
s q u a r e [ i ] [ j ] m a t r i x [ i ] [ j ] square[i][j] 是以matrix[i][j]结尾所能构成的最大的正方形的边长
那么问题的解就是 max{ square[i] [j] } ;
好了,现在就得思考子问题了,square[i][j]到底可不可以通过square[i - 1][j], square[i][j - 1] 或者square[i - 1][j - 1]得出来呢。

如果是这样定义问题的话,我们自然地想到,正方形的长和高是相等的,边长增加,必定是沿着对角线增加的。要想边长能在square[i - 1][j - 1]的基础上加1,那条件一定是matrix[i][j]为1,而且这个点上面一列有一定个数的1,这个点左边一排也有一定个数的1.所以就判断能不能满足这些条件。
那到底上面和左边要满足什么呢,如果square[i - 1][j] > square[i - 1][j - 1] 且 square[i ][j - 1] > square[i - 1][j - 1]的话,那square[i][j] = square[i - 1][j - 1] + 1。最后,可以分析出,square[i][j] = min{ square[i - 1][j], square[i][j - 1], square[i - 1][j - 1] } + 1。

最后就要考虑初始情况了。在最上面一行和最左边一列,如果是1,就初始化为1,如果是0,就初始化为0,因为构成不了正方形。

代码实现如下。

class Solution {
public:
    int maximalSquare(vector<vector<char>>& matrix) {
        int row = matrix.size();
        if(row == 0) return 0;
        int col = matrix[0].size();
        int square[row][col];
        for(int i = 0; i < row; i++){
            square[i][0] = (matrix[i][0] == '0') ? 0 : 1;
        }
        for(int j = 0; j < col; j++){
            square[0][j] = (matrix[0][j] == '0') ? 0 : 1;
        }
        
        for(int i = 1; i < row; i++){
            for(int j = 1; j < col; j++){
                if(matrix[i][j] == '0'){
                    square[i][j] = 0;
                }else{
                    square[i][j] = std::min(square[i - 1][j - 1], std::min(square[i - 1][j], square[i][j - 1])) + 1;
                    
                }
           }
        }
        int ans = 0;
        for(int i = 0; i < row; i++){
            for(int j = 0; j < col; j++){
                if(square[i][j] > ans){
                    ans = square[i][j];
                }
            }
        }
        return ans * ans;
    }
};

这一题难度是Medium,还有一题类似的,想不出来,就来做这道题了。那道题只是把正方形改成长方形了,像上面的例题答案就变成6了。但我做完这题还是没什么想法。本来想多一个维度,记录这一点结束的长和宽,但这个关系有点难找,比较复杂。下周再做。
Maximal Rectangle

猜你喜欢

转载自blog.csdn.net/pjsfirstlaw/article/details/84206003