[Naive Approach] Using Brute Force - O(n^4) Time and O(1) Space
Try every possible k×k subgrid by fixing the top-left corner and summing all k×k elements. Track the maximum sum found.
For every valid top-left corner (i, j) compute the sum of the k×k subgrid.
Update result if current sum is greater than maximum found so far.
C++
#include<bits/stdc++.h>usingnamespacestd;intmaximumSum(vector<vector<int>>&mat,intk){intn=mat.size();intres=INT_MIN;// Try every possible top-left corner of k x k subgridfor(inti=0;i<=n-k;i++){for(intj=0;j<=n-k;j++){intsum=0;// Compute sum of k x k subgridfor(intr=i;r<i+k;r++)for(intc=j;c<j+k;c++)sum+=mat[r][c];res=max(res,sum);}}returnres;}intmain(){vector<vector<int>>mat={{1,2,-1,4},{-8,-3,4,2},{3,8,10,-8},{-4,-1,1,7}};cout<<maximumSum(mat,3)<<endl;return0;}
Java
classGfG{staticintmaximumSum(int[][]mat,intk){intn=mat.length;intres=Integer.MIN_VALUE;// Try every possible top-left corner of k x k// subgridfor(inti=0;i<=n-k;i++){for(intj=0;j<=n-k;j++){intsum=0;// Compute sum of k x k subgridfor(intr=i;r<i+k;r++)for(intc=j;c<j+k;c++)sum+=mat[r][c];res=Math.max(res,sum);}}returnres;}publicstaticvoidmain(String[]args){int[][]mat={{1,2,-1,4},{-8,-3,4,2},{3,8,10,-8},{-4,-1,1,7}};System.out.println(maximumSum(mat,3));}}
Python
defmaximumSum(mat,k):n=len(mat)res=float('-inf')# Try every possible top-left corner of k x k subgridforiinrange(n-k+1):forjinrange(n-k+1):total=0# Compute sum of k x k subgridforrinrange(i,i+k):forcinrange(j,j+k):total+=mat[r][c]res=max(res,total)returnresif__name__=="__main__":mat=[[1,2,-1,4],[-8,-3,4,2],[3,8,10,-8],[-4,-1,1,7]]print(maximumSum(mat,3))
C#
usingSystem;classGfG{staticintmaximumSum(int[][]mat,intk){intn=mat.Length;intres=int.MinValue;// Try every possible top-left corner of k x k// subgridfor(inti=0;i<=n-k;i++){for(intj=0;j<=n-k;j++){intsum=0;// Compute sum of k x k subgridfor(intr=i;r<i+k;r++)for(intc=j;c<j+k;c++)sum+=mat[r][c];res=Math.Max(res,sum);}}returnres;}staticvoidMain(){int[][]mat={newint[]{1,2,-1,4},newint[]{-8,-3,4,2},newint[]{3,8,10,-8},newint[]{-4,-1,1,7}};Console.WriteLine(maximumSum(mat,3));}}
JavaScript
functionmaximumSum(mat,k){constn=mat.length;letres=-Infinity;// Try every possible top-left corner of k x k subgridfor(leti=0;i<=n-k;i++){for(letj=0;j<=n-k;j++){letsum=0;// Compute sum of k x k subgridfor(letr=i;r<i+k;r++)for(letc=j;c<j+k;c++)sum+=mat[r][c];res=Math.max(res,sum);}}returnres;}// Driver codeconstmat=[[1,2,-1,4],[-8,-3,4,2],[3,8,10,-8],[-4,-1,1,7]];console.log(maximumSum(mat,3));
Output
20
[Better Approach] Using 2D Prefix Sum - O(n^2) Time and O(n^2) Space
Instead of recomputing the sum of every k×k subgrid from scratch, precompute a 2D prefix sum array. Then any subgrid sum can be computed in O(1) using the inclusion-exclusion formula.
Build 2D prefix sum where pre[i][j] = sum of all elements in rectangle from (0,0) to (i-1,j-1).
For each valid top-left corner (i,j) compute k×k subgrid sum in O(1) using pre[i+k][j+k] - pre[i][j+k] - pre[i+k][j] + pre[i][j].
Track maximum sum.
C++
#include<bits/stdc++.h>usingnamespacestd;intmaximumSum(vector<vector<int>>&mat,intk){intn=mat.size();// Build 2D prefix sumvector<vector<int>>pre(n+1,vector<int>(n+1,0));for(inti=1;i<=n;i++)for(intj=1;j<=n;j++)pre[i][j]=mat[i-1][j-1]+pre[i-1][j]+pre[i][j-1]-pre[i-1][j-1];// Find maximum sum of k x k subgridintres=INT_MIN;for(inti=k;i<=n;i++)for(intj=k;j<=n;j++){intsum=pre[i][j]-pre[i-k][j]-pre[i][j-k]+pre[i-k][j-k];res=max(res,sum);}returnres;}intmain(){vector<vector<int>>mat={{1,2,-1,4},{-8,-3,4,2},{3,8,10,-8},{-4,-1,1,7}};cout<<maximumSum(mat,3)<<endl;return0;}
Java
classGfG{staticintmaximumSum(int[][]mat,intk){intn=mat.length;// Build 2D prefix sumint[][]pre=newint[n+1][n+1];for(inti=1;i<=n;i++)for(intj=1;j<=n;j++)pre[i][j]=mat[i-1][j-1]+pre[i-1][j]+pre[i][j-1]-pre[i-1][j-1];// Find maximum sum of k x k subgridintres=Integer.MIN_VALUE;for(inti=k;i<=n;i++)for(intj=k;j<=n;j++){intsum=pre[i][j]-pre[i-k][j]-pre[i][j-k]+pre[i-k][j-k];res=Math.max(res,sum);}returnres;}publicstaticvoidmain(String[]args){int[][]mat={{1,2,-1,4},{-8,-3,4,2},{3,8,10,-8},{-4,-1,1,7}};System.out.println(maximumSum(mat,3));}}
Python
defmaximumSum(mat,k):n=len(mat)# Build 2D prefix sumpre=[[0]*(n+1)for_inrange(n+1)]foriinrange(1,n+1):forjinrange(1,n+1):pre[i][j]=mat[i-1][j-1]+pre[i-1][j]+ \
pre[i][j-1]-pre[i-1][j-1]# Find maximum sum of k x k subgridres=float('-inf')foriinrange(k,n+1):forjinrange(k,n+1):total=pre[i][j]-pre[i-k][j]- \
pre[i][j-k]+pre[i-k][j-k]res=max(res,total)returnresif__name__=="__main__":mat=[[1,2,-1,4],[-8,-3,4,2],[3,8,10,-8],[-4,-1,1,7]]print(maximumSum(mat,3))
C#
usingSystem;classGfG{staticintmaximumSum(int[][]mat,intk){intn=mat.Length;// Build 2D prefix sumint[][]pre=newint[n+1][];for(inti=0;i<=n;i++)pre[i]=newint[n+1];for(inti=1;i<=n;i++)for(intj=1;j<=n;j++)pre[i][j]=mat[i-1][j-1]+pre[i-1][j]+pre[i][j-1]-pre[i-1][j-1];// Find maximum sum of k x k subgridintres=int.MinValue;for(inti=k;i<=n;i++)for(intj=k;j<=n;j++){intsum=pre[i][j]-pre[i-k][j]-pre[i][j-k]+pre[i-k][j-k];res=Math.Max(res,sum);}returnres;}staticvoidMain(){int[][]mat={newint[]{1,2,-1,4},newint[]{-8,-3,4,2},newint[]{3,8,10,-8},newint[]{-4,-1,1,7}};Console.WriteLine(maximumSum(mat,3));}}
JavaScript
functionmaximumSum(mat,k){constn=mat.length;// Build 2D prefix sumconstpre=Array.from({length:n+1},()=>newArray(n+1).fill(0));for(leti=1;i<=n;i++)for(letj=1;j<=n;j++)pre[i][j]=mat[i-1][j-1]+pre[i-1][j]+pre[i][j-1]-pre[i-1][j-1];// Find maximum sum of k x k subgridletres=-Infinity;for(leti=k;i<=n;i++)for(letj=k;j<=n;j++){constsum=pre[i][j]-pre[i-k][j]-pre[i][j-k]+pre[i-k][j-k];res=Math.max(res,sum);}returnres;}// Driver codeconstmat=[[1,2,-1,4],[-8,-3,4,2],[3,8,10,-8],[-4,-1,1,7]];console.log(maximumSum(mat,3));
Output
20
[Expected Approach] Using Sliding Window - O(n^2) Time and O(n) Space
Instead of storing a full 2D prefix sum array of size O(n^2), we use a 1D column sum array. For each row we maintain a sliding window of k rows per column. Then we slide a horizontal window of size k over the column sums to get each k×k subgrid sum in O(1).
Maintain colSum[j] = sum of k elements in column j ending at current row using a vertical sliding window.
Once k rows are in the window slide a horizontal window of size k over colSum to get k×k subgrid sums.
Track maximum sum found.
C++
#include<bits/stdc++.h>usingnamespacestd;intmaximumSum(vector<vector<int>>&mat,intk){intn=mat.size();// 1D column sum array — O(n) spacevector<int>colSum(n,0);intres=INT_MIN;for(inti=0;i<n;i++){// Update column sums with new row entering and old row leaving windowfor(intj=0;j<n;j++){colSum[j]+=mat[i][j];if(i>=k)colSum[j]-=mat[i-k][j];}// Slide horizontal window of size k over colSumif(i>=k-1){intwindowSum=0;for(intj=0;j<n;j++){windowSum+=colSum[j];if(j>=k)windowSum-=colSum[j-k];if(j>=k-1)res=max(res,windowSum);}}}returnres;}intmain(){vector<vector<int>>mat={{1,2,-1,4},{-8,-3,4,2},{3,8,10,-8},{-4,-1,1,7}};cout<<maximumSum(mat,3)<<endl;return0;}
Java
classGfG{staticintmaximumSum(int[][]mat,intk){intn=mat.length;// 1D column sum array — O(n) spaceint[]colSum=newint[n];intres=Integer.MIN_VALUE;for(inti=0;i<n;i++){// Update column sums with new row entering and// old row leaving windowfor(intj=0;j<n;j++){colSum[j]+=mat[i][j];if(i>=k)colSum[j]-=mat[i-k][j];}// Slide horizontal window of size k over colSumif(i>=k-1){intwindowSum=0;for(intj=0;j<n;j++){windowSum+=colSum[j];if(j>=k)windowSum-=colSum[j-k];if(j>=k-1)res=Math.max(res,windowSum);}}}returnres;}publicstaticvoidmain(String[]args){int[][]mat={{1,2,-1,4},{-8,-3,4,2},{3,8,10,-8},{-4,-1,1,7}};System.out.println(maximumSum(mat,3));}}
Python
defmaximumSum(mat,k):n=len(mat)# 1D column sum array — O(n) spacecolSum=[0]*nres=float('-inf')foriinrange(n):# Update column sums with new row entering and old row leaving windowforjinrange(n):colSum[j]+=mat[i][j]ifi>=k:colSum[j]-=mat[i-k][j]# Slide horizontal window of size k over colSumifi>=k-1:windowSum=0forjinrange(n):windowSum+=colSum[j]ifj>=k:windowSum-=colSum[j-k]ifj>=k-1:res=max(res,windowSum)returnresif__name__=="__main__":mat=[[1,2,-1,4],[-8,-3,4,2],[3,8,10,-8],[-4,-1,1,7]]print(maximumSum(mat,3))
C#
usingSystem;classGfG{staticintmaximumSum(int[][]mat,intk){intn=mat.Length;// 1D column sum array — O(n) spaceint[]colSum=newint[n];intres=int.MinValue;for(inti=0;i<n;i++){// Update column sums with new row entering and// old row leaving windowfor(intj=0;j<n;j++){colSum[j]+=mat[i][j];if(i>=k)colSum[j]-=mat[i-k][j];}// Slide horizontal window of size k over colSumif(i>=k-1){intwindowSum=0;for(intj=0;j<n;j++){windowSum+=colSum[j];if(j>=k)windowSum-=colSum[j-k];if(j>=k-1)res=Math.Max(res,windowSum);}}}returnres;}staticvoidMain(){int[][]mat={newint[]{1,2,-1,4},newint[]{-8,-3,4,2},newint[]{3,8,10,-8},newint[]{-4,-1,1,7}};Console.WriteLine(maximumSum(mat,3));}}
JavaScript
functionmaximumSum(mat,k){constn=mat.length;// 1D column sum array — O(n) spaceconstcolSum=newArray(n).fill(0);letres=-Infinity;for(leti=0;i<n;i++){// Update column sums with new row entering and old// row leaving windowfor(letj=0;j<n;j++){colSum[j]+=mat[i][j];if(i>=k)colSum[j]-=mat[i-k][j];}// Slide horizontal window of size k over colSumif(i>=k-1){letwindowSum=0;for(letj=0;j<n;j++){windowSum+=colSum[j];if(j>=k)windowSum-=colSum[j-k];if(j>=k-1)res=Math.max(res,windowSum);}}}returnres;}// Driver codeconstmat=[[1,2,-1,4],[-8,-3,4,2],[3,8,10,-8],[-4,-1,1,7]];console.log(maximumSum(mat,3));