每日一练——求一个只包含0、1的矩阵中只包含1的最大子矩阵大小

来源:互联网 发布:谷阿莫华尔街之狼 知乎 编辑:程序博客网 时间:2024/04/28 12:13

题目描述:

给定一个无序矩阵,其中只有1和0两种值,求只含有1的最大正方形的大小。

例如给定如下矩阵:

1 0 1 0 01 0 1 1 11 1 1 1 11 0 0 1 0
Return 4

int max_square(vector<vector<char>>& matrix) {    int row = matrix.size();    int col = matrix[0].size();    vector<vector<int> > dp(row+1, vector<int>(col+1, 0));    for (int i = 1; i <= row; i++)    {        for (int j = 1; j <= col; j++)        {            if (matrix[i-1][j-1] == '0')                dp[i][j] = 0;            else            {                dp[i][j] = min(dp[i-1][j-1], dp[i-1][j], dp[i][j-1]) + 1;                if (dp[i][j] > max)   max = dp[i][j];            }        }    }    return max * max;}

题目描述:
给定一个无序矩阵,其中只有1和0两种值,求只含有1的最大矩阵的大小。

例如给定如下矩阵:

1 0 1 0 01 0 1 1 11 1 1 1 11 0 0 1 0
return 6
int max_rec(int height[], int n){if (height == NULL || n == 0){return 0;}int max_area = 0;stack<int> stk;for (int i = 0; i < n; i++){while (!stk.empty() && height[i] <= height[stk.top()]){int j = stk.top();            stk.pop();            int k = stk.empty() ? -1 : stk.top();            int cur_area = (i - k - 1) * height[j];            max_area = max(max_area, cur_area);}        stk.push(i);}    while (!stk.empty())    {int j = stk.top();        stk.pop();        int k = stk.empty() ? -1 : stk.top();        int cur_area = (n - k -1) * height[j];        max_area = max(max_area, cur_area);    }    return max_area;}int max_square(vector<vector<int> >& matrix) {    int row = matrix.size();    int col = matrix[0].size();int max_area = 0;int *height = new int[col];for (int i = 0; i < col; i++){height[i] = 0;}for ( i = 0; i < row; i++){for (int j = 0; j < col; j++){height[j] = (matrix[i][j] == 0) ? 0 : height[j] + 1;}max_area = max(max_area, max_rec(height, col));}return max_area;}


0 0