日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

85. Maximal Rectangle

發布時間:2023/12/10 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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的值只是返回值一部分的例子。

class Solution {private int maxSum;public int maximalRectangle(char[][] matrix) {if(matrix==null || matrix.length==0) return 0;int m = matrix.length;int n = matrix[0].length;int maxArea = 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'){dp[i][j] = (j==0?1:dp[i][j-1]+1);int minWidth = dp[i][j];for(int upRow = i;upRow>=0;upRow--){int height = i-upRow+1;minWidth = Math.min(minWidth,dp[upRow][j]);maxArea = Math.max(maxArea,minWidth*height);}}}}return maxArea;}}

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的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。