这是一个访谈问题:在一个大小为mxn的二维数组中,对于每个值为零的元素,将该元素所在的整个行和列设置为零,并保持其余元素不变。 / p>
我可以想到的方法是迭代遍历数组中的每个元素,并且每次遇到零时,我用零标记整个行和列。但这很天真,请提出任何改进建议。
答案 0 :(得分:3)
如果允许额外的空间。只需维护两个标志数组。
一个代表排,另一个代表专栏。所有默认值都设置为1。
扫描原始矩阵,假设您在第x行和第y列找到0。只需设置row [x] = 0;和列[y] = 0;
然后再次扫描你的矩阵
for ( int i = 0; i < height; ++i )
for ( int j = 0; j < width; ++j )
M[i][j] = M[i][j] * row[i] * column[j];
然后你改变矩阵M
答案 1 :(得分:2)
算法的复杂性是二次的。如果整个矩阵最初全为零,则您将每列n_rows
次和每行n_columns
次擦除。
更好的方法是维护大小为m
和n
的布尔数组,以指示哪些行和列需要归零。遍历矩阵的元素,适当地填充布尔数组。完成后,根据您在其中找到的值遍历布尔数组并进行零填充。这样,每个元素最多被清零两次。
答案 2 :(得分:1)
如果你在去的时候归零,你会在找到的第一行和第一列之后清除。只需在清零行和列之前找到并记录所有零。或者,创建一个二维数组的副本并修改第二个数组,同时查看第一个数组以供参考。
答案 3 :(得分:1)
允许额外的空间?如果是这样,给定mxn矩阵,我们维护两个位图,其中一个大小为m,用于表示行何时应归零,类似于列。位图使得在O(1)中检查已经设置的行或列是非常容易的。
第1遍:矩阵的优化迭代,迭代遍历矩阵的元素寻找零,当我们找到零位置(i,j)时,我们可以设置两个位图中的相应位并停止迭代该行用于其他元素。 (毕竟我们将整行和列归零)。
传递2:现在我们有两个位图,循环遍历它们将行和列归零。如果你想使得非常优化(如果归零是一项代价高昂的操作),同时将行中的元素归零,则可以跳过,如果设置了相应的列位,则在遍历列时最终会归零。
编辑: 您可以在一次传递中完成,只需要为列提供位图,如果找到零则迭代矩阵,将整个行和列设置为零,设置列位图位置,然后继续下一行。在迭代后续行时使用位设置跳过列
答案 4 :(得分:0)
package helloWorld;
import java.util.HashMap;
import java.util.Map;
public class Solution {
public static int[][] myFunction(int[][] matrix) {
// find all rows and columns that contains zeros
// keep their indexes in hashMap
// loop over the matrix and check if you have row and column in your
// hashmap if yes make them zero, and also mark the row/column as
// already zeroed
Map<String, Boolean> map = new HashMap<String, Boolean>();
int length = matrix[0].length;
int heigth = matrix.length;
for (int i = 0; i < heigth; i++) {
for (int j = 0; j < length; j++) {
if (matrix[i][j] == 0) {
// mark and keep Row in Map
if (!map.containsKey("R" + i)) {
map.put("R" + i, false);
}
// mark and keep column in Map
if (!map.containsKey("C" + j)) {
map.put("C" + j, false);
}
}
}
}
for (int i = 0; i < length; i++) {
//check if row need to be zeroed and if yes zero it and Mark it
//as done
if (map.containsKey("R" + i) && !map.get("R" + i)) {
for (int j = 0; j < length; j++) {
matrix[i][j] = 0;
}
map.put("R" + i, true);
}
//check if column need to be zeroed and if yes zero it and Mark
//it as done
if (map.containsKey("C" + i) && !map.get("C" + i)) {
for (int j = 0; j < heigth; j++) {
matrix[j][i] = 0;
}
map.put("C" + i, true);
}
}
return matrix;
}
public static void main(String[] args) {
int[][] matrix = { { 1, 2, 0, 7, 6 }, { 1, 0, 8, 7, 5 }, { 1, 2, 1,
7,-1 }, { 1, 2, 3, 4, 0 } };
print(matrix);
System.out.println("#####################################");
matrix=myFunction(matrix);
print(matrix);
}
public static void print(int[][] matrix) {
int h = matrix.length;
int l = matrix[0].length;
for (int i = 0; i < h; i++) {
for (int j = 0; j < l; j++) {
System.out.print(" " + matrix[i][j] + " ");
}
System.out.println();
}
}
}