给定一个仅包含 0
和 1
、大小为 rows x cols
的二维二进制矩阵,找出只包含 1
的最大矩形,并返回其面积。
示例 1:
思路一:单调栈
int maximalRectangle(char** matrix, int matrixSize, int* matrixColSize){int dp[matrixSize][matrixColSize[0] + 2];memset(dp, 0, sizeof(dp));//初始化for(int i = 0; i < matrixSize; i++){for(int j = 0; j < matrixColSize[0]; j++){if(matrix[i][j] == '1'){dp[i][j+1] = (i == 0 ? 0 : dp[i-1][j+1])+1;}}}int max = 0;for(int i = 0; i < matrixSize; i++){int stack[matrixColSize[0]+2];int top = -1;stack[++top] = 0;for(int j = 1; j < matrixColSize[0]+2; j++){while(dp[i][j] < dp[i][stack[top]]){max = fmax(max, (j - stack[top-1] - 1) * dp[i][stack[top]]);--top;}stack[++top] = j;}}return max;
}
分析:
本题与上题相似,同为单调栈解法,可将矩形转换为长和宽,计算长宽的乘积最大值,根据单调递减递归到最小值计算矩形最大值,最后返回答案
总结:
本题考察单调栈的应用,除此之外本题还可用动态规划的方法解决,单调栈解法注意对数组处理,输入的为字符串,与数字处理方法有差异