天天看點

清除行列

題目描述

請編寫一個算法,若N階方陣中某個元素為0,則将其所在的行與列清零。

給定一個N階方陣int[][](C++中為vector<vector><int>>)mat和矩陣的階數n,請傳回完成操作後的int[][]方陣(C++中為vector<vector><int>>),保證n小于等于300,矩陣中的元素為int範圍内。</int></vector></int></vector>

測試樣例:

[[1,2,3],[0,1,2],[0,0,1]]      
傳回:[[0,0,3],[0,0,0],[0,0,0]]


題目陷阱:一看到這個題目可能會想到周遊整個矩陣,隻要發現值為0,就将其所在行和與列全部清零。這個是個錯誤的思想,當清零的時候,0元素覆寫了還沒有周遊到的元素,是以隻要數組有一個零,最後就導緻整個數組全為0。

解題:是以需要提前知道哪些行和列需要清零,在清零之前設定兩個bool類型的數組row,col,确定需要清零的行和列。之後再周遊一遍數組就可以了

c++代碼如下:      
class Clearer {
public:
    vector<vector<int> > clearZero(vector<vector<int> > mat, int n) {
        // write code here
        vector<bool> rows(n, false);
        vector<bool> cols(n, false);
        for (int i = 0; i < n; ++i) {
            for (int j = 0; j < n; ++j) {
                if (mat[i][j] == 0) {
                    rows[i] = cols[j] = true;
                }
            }
        }
        for (int i = 0; i < n; ++i) {
            for (int j = 0; j < n; ++j) {
                if (rows[i] || cols[j]) {
                    mat[i][j] = 0;
                }
            }
        }
        return mat;
    }
};      

轉載于:https://www.cnblogs.com/cstdio1/p/11343706.html