将所有cols和行标记为零

时间:2013-09-05 15:59:28

标签: algorithm data-structures

这是一个访谈问题:在一个大小为mxn的二维数组中,对于每个值为零的元素,将该元素所在的整个行和列设置为零,并保持其余元素不变。 / p>

我可以想到的方法是迭代遍历数组中的每个元素,并且每次遇到零时,我用零标记整个行和列。但这很天真,请提出任何改进建议。

5 个答案:

答案 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次擦除。

更好的方法是维护大小为mn的布尔数组,以指示哪些行和列需要归零。遍历矩阵的元素,适当地填充布尔数组。完成后,根据您在其中找到的值遍历布尔数组并进行零填充。这样,每个元素最多被清零两次。

答案 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();
        }
    }
}