class Solution {
public int largestSubmatrix(int[][] matrix) {
int m = matrix.length;
int n = matrix[0].length;
//For each column, find the number of consecutive ones ending at each position.
for(int i=1; i<m; i++)
for(int j=0; j<n; j++)
if(matrix[i][j] == 1)
matrix[i][j] += matrix[i-1][j];
int ans = 0;
//For each row, sort the cumulative ones in non-increasing order and "fit" the largest submatrix.
for(int i=0; i<m;i++)
{
Arrays.sort(matrix[i]);
for(int j=n-1;j>=0;j--)
{
int h = matrix[i][j];
ans = Math.max(ans, h*(n-j));
}
}
return ans;
}
}