
Input: matrix =[[0,0,1],[1,1,1],[1,0,1]]Output: 4Explanation: You can rearrange the columns as shown above.The largest submatrix of 1s,in bold, has an area of 4.

Input: matrix =[[1,0,1,0,1]]Output: 3Explanation: You can rearrange the columns as shown above.The largest submatrix of 1s,in bold, has an area of 3.
Input: matrix =[[1,1,0],[1,0,1]]Output: 2Explanation: Notice that you must rearrange entire columns, and there is no way to make a submatrix of 1s larger than an area of 2.
For each row, treat the number of consecutive 1’s above (including itself) as a histogram. By sorting each row’s histogram in descending order, we can greedily maximize the area of a submatrix of 1’s after rearranging columns.
classSolution {
public:int largestSubmatrix(vector<vector<int>>& matrix) {
int m = matrix.size(), n = matrix[0].size(), ans =0;
for (int i =1; i < m; ++i)
for (int j =0; j < n; ++j)
if (matrix[i][j]) matrix[i][j] += matrix[i-1][j];
for (auto& row : matrix) {
vector<int> h = row;
sort(h.rbegin(), h.rend());
for (int j =0; j < n; ++j)
ans = max(ans, h[j] * (j+1));
}
return ans;
}
};
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
funclargestSubmatrix(matrix [][]int) int {
m, n:= len(matrix), len(matrix[0])
ans:=0fori:=1; i < m; i++ {
forj:=0; j < n; j++ {
ifmatrix[i][j] ==1 {
matrix[i][j] +=matrix[i-1][j]
}
}
}
for_, row:=rangematrix {
h:= append([]int(nil), row...)
sort.Sort(sort.Reverse(sort.IntSlice(h)))
forj:=0; j < n; j++ {
ifh[j]*(j+1) > ans { ans = h[j]*(j+1) }
}
}
returnans}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
classSolution {
publicintlargestSubmatrix(int[][] matrix) {
int m = matrix.length, n = matrix[0].length, ans = 0;
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];
for (int[] row : matrix) {
int[] h = row.clone();
Arrays.sort(h);
for (int j = 0; j < n; ++j)
ans = Math.max(ans, h[n-1-j]* (j+1));
}
return ans;
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
classSolution {
funlargestSubmatrix(matrix: Array<IntArray>): Int {
val m = matrix.size
val n = matrix[0].size
var ans = 0for (i in1 until m)
for (j in0 until n)
if (matrix[i][j] ==1) matrix[i][j] += matrix[i-1][j]
for (row in matrix) {
val h = row.copyOf()
h.sortDescending()
for (j in0 until n)
ans = maxOf(ans, h[j] * (j+1))
}
return ans
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
classSolution:
deflargestSubmatrix(self, matrix: list[list[int]]) -> int:
m, n = len(matrix), len(matrix[0])
for i in range(1, m):
for j in range(n):
if matrix[i][j]:
matrix[i][j] += matrix[i-1][j]
ans =0for row in matrix:
h = sorted(row, reverse=True)
for j, v in enumerate(h):
ans = max(ans, v * (j+1))
return ans
impl Solution {
pubfnlargest_submatrix(matrix: Vec<Vec<i32>>) -> i32 {
let m = matrix.len();
let n = matrix[0].len();
letmut mat = matrix.clone();
for i in1..m {
for j in0..n {
if mat[i][j] !=0 {
mat[i][j] += mat[i-1][j];
}
}
}
letmut ans =0;
for row in mat.iter_mut() {
row.sort_by(|a, b| b.cmp(a));
for (j, &v) in row.iter().enumerate() {
ans = ans.max(v * (j asi32+1));
}
}
ans
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
classSolution {
largestSubmatrix(matrix: number[][]):number {
constm=matrix.length, n=matrix[0].lengthfor (leti=1; i<m; ++i)
for (letj=0; j<n; ++j)
if (matrix[i][j]) matrix[i][j] +=matrix[i-1][j]
letans=0for (constrowofmatrix) {
consth= [...row].sort((a, b) =>b-a)
for (letj=0; j<n; ++j)
ans= Math.max(ans, h[j] * (j+1))
}
returnans }
}