Skip to content

Commit 678e095

Browse files
authored
Merge pull request #398 from AbhiC7721/devincept2
Added maximal square question
2 parents 260cfec + dae3672 commit 678e095

File tree

1 file changed

+87
-0
lines changed

1 file changed

+87
-0
lines changed
Lines changed: 87 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,87 @@
1+
/*
2+
Question => https://leetcode.com/problems/maximal-square/
3+
4+
Description:
5+
Given an m x n binary matrix filled with 0's and 1's, find the largest square containing only 1's and return its area.
6+
7+
Eg:
8+
m = 4 and n = 5
9+
10+
1 0 1 0 0
11+
1 0 |1 1| 1
12+
1 1 |1 1| 1
13+
1 0 0 1 0
14+
15+
The answer here is: 4 (2x2) shown here
16+
17+
Soltuion:
18+
19+
The approach is to use dynamic programming.
20+
We use another matrix to store the maximal square possible using the (i,j)-th element of matrix
21+
as the bottom-left corner of the matrix.
22+
Base cases :
23+
a) Fill the left-most column with 1 and (0 where matrix is 0) dp[i][n-1]=1 or 0
24+
b) Fill the bottom-most row with 1 and (0 where matrix is 0). dp[m-1][i]=1 or 0
25+
Then for general case:
26+
dp[i][j] = 0 => if matrix[i][j]=0
27+
dp[i][j] = 1 + min(dp[i+1][j], dp[i+1][j+1], dp[i][j+1])
28+
for matrix[i][j]=> dp[i][j] is 1 + minimum of cell on right, bottom and diagonally right
29+
30+
The answer is the max. value in the dp matrix.
31+
32+
*/
33+
34+
// The code for the solution =>
35+
36+
#include<bits/stdc++.h>
37+
using namespace std;
38+
39+
int maximalSquare(vector<vector<char>>& matrix) {
40+
int n = matrix.size();
41+
int m = matrix[0].size();
42+
vector<vector<int>>dp(n, vector<int>(m, 0)); // dp matrix
43+
dp[n-1][m-1] = matrix[n-1][m-1]-'0'; // dp[n-][m-1] is same as matrix[n-1][m-1]
44+
int ans = dp[n-1][m-1];
45+
//last column is 1 or 0
46+
for(int i=0;i<n-1;i++){
47+
dp[i][m-1]=matrix[i][m-1]-'0';
48+
ans = max(ans, dp[i][m-1]);
49+
}
50+
//last row is 1 or 0
51+
for(int j=0;j<m-1;j++){
52+
dp[n-1][j]=matrix[n-1][j]-'0';
53+
ans = max(ans, dp[n-1][j]);
54+
}
55+
for(int i=n-2;i>=0;i--)
56+
{
57+
for(int j=m-2;j>=0;j--)
58+
{
59+
// dp[i][j] is 0 when matrix[i][j] is 0
60+
if(matrix[i][j]=='0')
61+
dp[i][j]=0;
62+
//dp[i][j] is 1 + min(right_hand, diagonally_down, down)
63+
else
64+
dp[i][j] = 1+min(dp[i][j+1],min(dp[i+1][j],dp[i+1][j+1]));
65+
// ans is max of all values in dp
66+
ans = max(dp[i][j], ans);
67+
}
68+
}
69+
return ans*ans;
70+
}
71+
72+
int main()
73+
{
74+
int m,n;
75+
cin>>m>>n;
76+
vector<vector<char>>matrix(m, vector<char>(n, 0));
77+
for(int i=0; i<m; i++)
78+
{
79+
for(int j=0; j<n; j++)
80+
{
81+
cin>>matrix[i][j];
82+
}
83+
}
84+
//max. area of 1s
85+
int ans = maximalSquare(matrix);
86+
cout<<ans<<"\n";
87+
}

0 commit comments

Comments
 (0)