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

题目描述:

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

例如给定如下矩阵:

1 0 1 0 0
1 0 1 1 1
1 1 1 1 1
1 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 0
1 0 1 1 1
1 1 1 1 1
1 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、1的矩阵中只包含1的最大子矩阵大小)