85. Maximal Rectangle
用dp計算矩形面積
文章目錄
- 1題目理解
- 2分析
- 2.1 暴力搜索
- 2.2 動態規劃
- 3 相關題目
1題目理解
輸入:char[][] matrix 是一個二維數組,值由0和1組成。
輸出:一個矩形的面積,這個矩形只包含1。
例子:
Input:
[
[“1”,“0”,“1”,“0”,“0”],
[“1”,“0”,“1”,“1”,“1”],
[“1”,“1”,“1”,“1”,“1”],
[“1”,“0”,“0”,“1”,“0”]
]
Output: 6
2分析
最開始沒理解,直接想之前做過,從一個點向4個方向延伸,找最大值。寫完,發現圖形不是矩形。
開始思考,因為是矩形該怎么做。思路參考力扣。
2.1 暴力搜索
枚舉左上角(x1,y1)坐標和右下角(x2,y2)左邊,計算面積。時間復雜度O(m3n3)O(m^3n^3)O(m3n3)。
2.2 動態規劃
dp[i][j] = 在第i行,以j結尾的最長的包含1的子數組的長度。
dp[i][j]=0,matrix[i][j]=′0′dp[i][j] = 0,matrix[i][j]='0'dp[i][j]=0,matrix[i][j]=′0′
dp[i][j]=dp[i][j?1]+1,matrix[i][j]=′1′dp[i][j] = dp[i][j-1]+1,matrix[i][j]='1'dp[i][j]=dp[i][j?1]+1,matrix[i][j]=′1′
例如上面的例子 dp[1] = {1,0,1,2,3}
知道了每一行的寬度,從第i行開始,向上計算,找到最小的寬度,乘以高,就是矩形的面積。
這是一個動態規劃dp的值只是返回值一部分的例子。
3 相關題目
304 Range Sum Query 2D – Immutable 計算一個矩陣范圍內的數字和
class NumMatrix {int[][] dp;public NumMatrix(int[][] matrix) {if(matrix == null || matrix.length == 0) return;int m = matrix.length;int n = matrix[0].length;dp = new int[m][n];for(int i=0;i<m;i++){for(int j = 0;j < n;j++){dp[i][j] = (i>0?dp[i-1][j]:0) + (j>0?dp[i][j-1]:0) - (i>0 && j>0? dp[i-1][j-1]:0) + matrix[i][j];}}}public int sumRegion(int row1, int col1, int row2, int col2) {if(dp == null) return 0;return dp[row2][col2] - (row1>0?dp[row1-1][col2]:0) - (col1 >0 ?dp[row2][col1-1]:0) + (row1>0 && col1>0 ?dp[row1-1][col1-1]:0);} }221 Maximal Square 計算正方形的最大面積
class Solution {public int maximalSquare(char[][] matrix) {if(matrix==null || matrix.length==0) return 0;int m = matrix.length;int n = matrix[0].length;int maxSide = 0;int[][] dp = new int[m][n];for(int i=0;i<m;i++){for(int j=0;j<n;j++){if(matrix[i][j]=='1'){if(i==0 || j==0){dp[i][j] = 1;}else{dp[i][j] = Math.min(dp[i-1][j],Math.min(dp[i-1][j-1],dp[i][j-1]))+1;}maxSide = Math.max(maxSide,dp[i][j]);}}}return maxSide * maxSide;} }1277 Count Square Submatrices with All Ones 數一數正方形的個數
class Solution {public int countSquares(int[][] matrix) {int count = 0;int m = matrix.length;int n = matrix[0].length;int[][] dp = new int[m][n];for(int i = 0;i<m;i++){for(int j=0;j<n;j++){if(matrix[i][j] == 1){if(i==0 || j==0){dp[i][j] =1;}else{dp[i][j] = Math.min(Math.min(dp[i-1][j],dp[i][j-1]),dp[i-1][j-1])+1;}count += dp[i][j];}}}return count;}}總結
以上是生活随笔為你收集整理的85. Maximal Rectangle的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Linux 面试常考题总结大全【建议收藏
- 下一篇: GMT与UTC简介