221.最大正方形
在一個由 0 和 1 組成的二維矩陣內,找到只包含 1 的最大正方形,並返回其面積。
示例:
輸入:
1 0 1 0 0
1 0 1 1 1
1 1 1 1 1
1 0 0 1 0
輸出: 4
來源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/maximal-square
著作權歸領釦網絡所有。商業轉載請聯繫官方授權,非商業轉載請註明出處。
解題思路:請看大佬:https://zhuanlan.zhihu.com/p/85240028
要找到二維矩陣中,只包含 1 的最大正方形,我們可以用動態規劃解決。用 dp[i][j] 表示直到 (i, j) 位置的可以包含最大正方形的邊長,注意這裏的正方形需要包含 (i, j) 位置。
在矩形左側和上邊界,如果 matrix[i][j]=='1',有 dp[0][j]==dp[i][0]==1,即能構成的最大正方形的邊長爲 1。
而對於更一般的情況:
- 如果 matrix[i][j]=='0',顯然 dp[i][j]==0。
- 如果 matrix[i][j]=='1',狀態轉移方程爲:dp[i][j]=min(min(dp[i-1][j], dp[i][j-1]), dp[i-1][j-1])+1,即 (i, j) 位置的值被其左側、上側、左上側的值所限制。
class Solution { public: int maximalSquare(vector<vector<char>>& matrix) { int row = matrix.size(); if(row<1) return 0; int col = matrix[0].size(); if(col<1) return 0; vector<vector<int>> dp(row,vector<int>(col,0)); int res = 0; for(int i=0;i<row;i++){ for(int j=0;j<col;j++){ if(i==0||j==0) dp[i][j] = matrix[i][j]-'0'; else if(matrix[i][j]=='1'){ dp[i][j] = min(min(dp[i-1][j], dp[i][j-1]), dp[i-1][j-1]) + 1; } else{ dp[i][j] = 0; } res = max(res,dp[i][j]); } } return res*res;//返回的是面積 } };