深入淺出Mysql索引優化專題分享|面試怪圈
阿新 • • 發佈:2021-12-19
如果直接開始for迴圈,遇到一個0就清空對應的行和列,那麼最終會導致矩陣多出很多0(原本不是0的位置,遍歷到的時候也被計為0)
第一種方法
可以使用輔助矩陣:遍歷矩陣的過程中,遇到一個0,就把它對應的行和列記入輔助矩陣(boolean型別)中,遍歷結束後,根據輔助矩陣的值來對原矩陣進行改造。這種思路比較簡單,程式碼也很好實現,但是它的空間複雜度為 O(MN)。
第二種方法
那麼我們就需要想一種對自身進行操作的方法,不需要輔助矩陣。我們可以使用第一行和第一列來記錄是否存在0點。但是問題就是:如果第一行和第一列也存在0點,這樣記錄會被覆蓋。因此我們需要用兩個boolean變數來記錄第一行和第一列是否存在零點,最後記錄完成後再進行改造,改造的具體方法是:行和列分別從1開始遍歷(因為第一行和第一列單獨處理),如果對應的第一列或第一行為0,那麼就清空對應對應行/列,注意行和列的清空是相反的 。
class Solution { public void setZeroes(int[][] matrix) { boolean ifRow=false,ifCol=false; //記錄第一行和第一列是否有零 int m = matrix.length, n = matrix[0].length; for(int i=0;i<m;i++){ //遍歷第一列 if(matrix[i][0]==0){ ifCol = true; } }for(int i=0;i<n;i++){ if(matrix[0][i]==0){ ifRow = true; } } //記錄完畢,接下來遍歷矩陣 for(int i=0;i<m;i++){ for(int j=0;j<n;j++){ if(matrix[i][j]==0){ //用第一行和第一列記錄 matrix[0][j]=0; matrix[i][0]=0; } } } //從1開始(因為第一行和第一列要單獨處理) for(int i=1;i<m;i++){ if(matrix[i][0]==0){ for(int j=1;j<n;j++){ matrix[i][j]=0; } } } for(int i=1;i<n;i++){ if(matrix[0][i]==0){ for(int j=1;j<m;j++){ matrix[j][i]=0; } } } if(ifRow){ //第一行原本就有0 for(int i=0;i<n;i++) matrix[0][i]=0; } if(ifCol){ //第一列原本就有0 for(int i=0;i<m;i++) matrix[i][0]=0; } } }