可以開乙個額外的二維陣列,記錄每個位置的元素是否已被訪問過。
然後我們遍歷原來的二維陣列,只要沒被訪問過且元素為0,那麼就將該元素所在的行和列的元素值置為0,
並且將這一行的所有元素都設定為已經訪問過,以免之後的遍歷碰到被置為0的元素也將那一行那一列的元素置為0.
這裡要注意,對於乙個為0且未被訪問的元素所在的行和列的元素置0的時候,要跳過本來就為0的元素,因為可能之後的遍歷
到了其他的本來就為0的元素,由於置了那個元素的狀態為訪問過,就會跳過這個元素,導致沒有將那個元素所在的行和列所在的
元素置0.
**如下:
class solution
}for(int k = 0; k < cols; ++k) }}
}}}};
給每乙個元素都設定乙個訪問狀態需要開二維陣列,有點麻煩。
由於我們只需要把0所在的行和列的元素置為0,所以我們可以這樣:遍歷一遍陣列,如果某個元素為0,
那麼我們記錄一下這個元素的行號和列號。
最後把所有我們記錄過的行和列的元素全部置為0即可。
使用這種方法需要開乙個o(n)的陣列記錄每一行是否有0元素,還要開乙個o(m)陣列記錄每一列是否有0元素。
因此空間開銷是o(m + n)。
**如下:
class solution }}
for(int i = 0; i < rows; ++i) }}
for(int j = 0; j < cols; ++j) }}
}};
由於要將0元素所在的行和列所在的所有元素都置為0,我們就需要記錄哪些行哪些列含有0元素,但是又不能開陣列記錄,那怎麼辦呢?
可以考慮直接用原陣列記錄,比如解法二里開了乙個列大小的陣列記錄每一行是否有0,又開了乙個行大小的陣列記錄每一列是否有0.
我們可以直接在第0行和第0列記錄!比如,如果martix[i][j]為0,那麼我們就讓martix[i][0]為0,表示第i行含有元素0,之後需要將該行所有元素都改為0.
再讓martix[0][j]為0,表示第j列含有元素0,之後需要講該列所有元素都改為0.
這樣我們就不需要額外開陣列了,但是又有個問題,這樣修改了原來的第0行和第0列的元素,咋辦?
問題不大,只能開常數空間,不代表不能開空間,我們額外用兩個變數記錄第0行和第0列是否有0,如果有,在最後就將第0行(列)的所有元素改為0,
如果沒有,那麼如果第0行或第0列的元素所在的行(列)沒有0,那麼他們還是原來的值(沒有被修改),如果有,那說明(對第0行/列元素的修改)正好改對了呀,
反正他們最後本來就是0! 這樣就解決了空間的問題,使用常數空間就可以將矩陣置0.
**如下:
class solution
}for(int i = 0; i < rows; ++i)
}for(int i = 1; i < rows; ++i) }}
for(int j = 1; j < cols; ++j) }}
for(int i = 1; i < rows; ++i) }}
for(int j = 1; j < cols; ++j) }}
if(firstrowhaszero)
}if(firstcolhaszero) }}
};
leetcode 73 矩陣置零
給定乙個 m x n 的矩陣,如果乙個元素為 0,則將其所在行和列的所有元素都設為 0。請使用原地演算法。示例 1 輸入 1,1,1 1,0,1 1,1,1 輸出 1,0,1 0,0,0 1,0,1 示例 2 輸入 0,1,2,0 3,4,5,2 1,3,1,5 輸出 0,0,0,0 0,4,5,0...
leetcode73 矩陣置零
給定乙個 m x n 的矩陣,如果乙個元素為 0,則將其所在行和列的所有元素都設為 0。請使用原地演算法。示例 1 輸入 1,1,1 1,0,1 1,1,1 輸出 1,0,1 0,0,0 1,0,1 空間複雜度為o mn 的解法自不用多說,直接新建乙個和matrix等大小的矩陣,然後一行一行的掃,只...
leetcode 73 矩陣置零
給定乙個 m x n 的矩陣,如果乙個元素為 0,則將其所在行和列的所有元素都設為 0。請使用原地演算法。示例 1 輸入 1,1,1 1,0,1 1,1,1 輸出 1,0,1 0,0,0 1,0,1 示例 2 輸入 0,1,2,0 3,4,5,2 1,3,1,5 輸出 0,0,0,0 0,4,5,0...