給定一個僅包含?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;
}
?分析:
本題與上題相似,同為單調棧解法,可將矩形轉換為長和寬,計算長寬的乘積最大值,根據單調遞減遞歸到最小值計算矩形最大值,最后返回答案
總結:
本題考察單調棧的應用,除此之外本題還可用動態規劃的方法解決,單調棧解法注意對數組處理,輸入的為字符串,與數字處理方法有差異