一、今日练习题目:
编写一种算法,若M × N矩阵中某个元素为0,则将其所在的行与列清零。
给定一个 m x n 的矩阵,如果一个元素为 0 ,则将其所在行和列的所有元素都设为 0 。请使用 原地 算法。
给你一个二进制矩阵 matrix ,它的大小为 m x n ,你可以将 matrix 中的 列 按任意顺序重新排列。请你返回最优方案下将 matrix 重新排列后,全是 1 的子矩阵面积。
二、源码分析
题目1:面试题 01.08. 零矩阵
class Solution {
public void setZeroes(int[][] matrix) {
int m = matrix.length, n = matrix[0].length;
boolean[] row = new boolean[m];
boolean[] col = new boolean[n];
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
if (matrix[i][j] == 0) {
row[i] = col[j] = true;
}
}
}
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
if (row[i] || col[j]) {
matrix[i][j] = 0;
}
}
}
}
}
每次遇到矩阵中0数的时候,记录当前的行列值信息(新建两个行列的Boolean数组),最后再遍历赋0。
题目2:73. 矩阵置零
和上道题 一样
题目3:1727. 重新排列后的最大子矩阵
class Solution {
public int largestSubmatrix(int[][] matrix) {
int n = matrix.length;
int m = matrix[0].length;
int res = 0;
for (int i = 1; i < n; i++) {
for (int j = 0; j < m; j++) {
if (matrix[i][j] == 1) {
matrix[i][j] += matrix[i-1][j];
}
}
}
for (int i = 0; i < n; i++) {
Arrays.sort(matrix[i]);
for (int j = m - 1;j >= 0; j-- ) {
int height = matrix[i][j];
res = Math.max(res, height*(m-j));
}
}
return res;
}
}
预处理数组,计算以这个点为结尾,上面有多少个连续的1,就是这一列以这个点为结尾的最大高度,这样就将二维问题转成一维。遍历每一行,对每一行进行排序,记录矩形的最长的高度,每次更新结果