Welcome to Subscribe On Youtube
1727. Largest Submatrix With Rearrangements
Description
You are given a binary matrix matrix
of size m x n
, and you are allowed to rearrange the columns of the matrix
in any order.
Return the area of the largest submatrix within matrix
where every element of the submatrix is 1
after reordering the columns optimally.
Example 1:
Input: matrix = [[0,0,1],[1,1,1],[1,0,1]] Output: 4 Explanation: You can rearrange the columns as shown above. The largest submatrix of 1s, in bold, has an area of 4.
Example 2:
Input: matrix = [[1,0,1,0,1]] Output: 3 Explanation: You can rearrange the columns as shown above. The largest submatrix of 1s, in bold, has an area of 3.
Example 3:
Input: matrix = [[1,1,0],[1,0,1]] Output: 2 Explanation: Notice that you must rearrange entire columns, and there is no way to make a submatrix of 1s larger than an area of 2.
Constraints:
m == matrix.length
n == matrix[i].length
1 <= m * n <= 105
matrix[i][j]
is either0
or1
.
Solutions
-
class Solution { public int largestSubmatrix(int[][] matrix) { int m = matrix.length, n = matrix[0].length; 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] + 1; } } } int ans = 0; for (var row : matrix) { Arrays.sort(row); for (int j = n - 1, k = 1; j >= 0 && row[j] > 0; --j, ++k) { int s = row[j] * k; ans = Math.max(ans, s); } } return ans; } }
-
class Solution { public: int largestSubmatrix(vector<vector<int>>& matrix) { int m = matrix.size(), n = matrix[0].size(); 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] + 1; } } } int ans = 0; for (auto& row : matrix) { sort(row.rbegin(), row.rend()); for (int j = 0; j < n; ++j) { ans = max(ans, (j + 1) * row[j]); } } return ans; } };
-
class Solution: def largestSubmatrix(self, matrix: List[List[int]]) -> int: for i in range(1, len(matrix)): for j in range(len(matrix[0])): if matrix[i][j]: matrix[i][j] = matrix[i - 1][j] + 1 ans = 0 for row in matrix: row.sort(reverse=True) for j, v in enumerate(row, 1): ans = max(ans, j * v) return ans
-
func largestSubmatrix(matrix [][]int) int { m, n := len(matrix), len(matrix[0]) for i := 1; i < m; i++ { for j := 0; j < n; j++ { if matrix[i][j] == 1 { matrix[i][j] = matrix[i-1][j] + 1 } } } ans := 0 for _, row := range matrix { sort.Ints(row) for j, k := n-1, 1; j >= 0 && row[j] > 0; j, k = j-1, k+1 { ans = max(ans, row[j]*k) } } return ans }
-
function largestSubmatrix(matrix: number[][]): number { for (let column = 0; column < matrix[0].length; column++) { for (let row = 0; row < matrix.length; row++) { let tempRow = row; let count = 0; while (tempRow < matrix.length && matrix[tempRow][column] === 1) { count++; tempRow++; } while (count !== 0) { matrix[row][column] = count; count--; row++; } } } for (let row = 0; row < matrix.length; row++) { matrix[row].sort((a, b) => a - b); } let maxSubmatrixArea = 0; for (let row = 0; row < matrix.length; row++) { for (let col = matrix[row].length - 1; col >= 0; col--) { maxSubmatrixArea = Math.max( maxSubmatrixArea, matrix[row][col] * (matrix[row].length - col), ); } } return maxSubmatrixArea; }