leetcode 73 矩陣置零
阿新 • • 發佈:2021-08-24
leetcode 73 矩陣置零
給定一個 m x n 的矩陣,如果一個元素為 0 ,則將其所在行和列的所有元素都設為 0 。請使用 原地 演算法。
進階:
一個直觀的解決方案是使用 O(mn) 的額外空間,但這並不是一個好的解決方案。
一個簡單的改進方案是使用 O(m + n) 的額外空間,但這仍然不是最好的解決方案。
你能想出一個僅使用常量空間的解決方案嗎?
來源:力扣(LeetCode)
連結:https://leetcode-cn.com/problems/set-matrix-zeroes
著作權歸領釦網路所有。商業轉載請聯絡官方授權,非商業轉載請註明出處。
舉例:
0120 0000
3452 ----》 0450
0310 0310
法一,思路混亂亂寫的
想著把每一個0的座標記下來,之後再對每一個0處理,為了記座標,想到了Pair
class Solution { public void setZeroes(int[][] matrix) { int m=matrix.length; int n=matrix[0].length; int [] row = new int[n]; //這裡想著初始話一行0,之後將行置零的時候,可以直接克隆 for(int i=0;i<n;i++){ row[i]=0; } ArrayList<Pair<Integer,Integer>> arrayList = new ArrayList<>(); for(int i=0;i<m;i++){ for(int j=0;j<n;j++){ if(matrix[i][j]==0){ arrayList.add(new Pair(i,j)); } } } for(Pair<Integer,Integer> p:arrayList){ matrix[p.getKey()] = row.clone(); for(int i=0;i<m;i++){ matrix[i][p.getValue()]=0; } } } }
上面這個方法,空間使用直接達到了O(m+n+m)(好像是吧,反正不小)而且解法挺蠢的
法二 使用兩個標記變數
這個方法是看了題解後做出來的,還有引入一個標記變數的做法,我沒看。
class Solution { public void setZeroes(int[][] matrix) { int m=matrix.length; int n=matrix[0].length; boolean row0=false; boolean col0=false; //第一列有沒有0 for(int i=0;i<m;i++){ if(matrix[i][0]==0){ col0=true; } } //第一行有沒有0 for(int j=0;j<n;j++){ if(matrix[0][j]==0){ row0=true; } } for(int i = 1;i < m; i++){ for(int j = 1;j < n; j++){ if(matrix[i][j]==0){ matrix[i][0]=matrix[0][j]=0; } } } //將第一行第一列外的元素遍歷,如果該置零就置零 for(int i=1;i<m;i++){ for(int j=1;j<n;j++){ if(matrix[i][0]==0||matrix[0][j]==0){ matrix[i][j]=0; } } } //搞下第一行,第一列 if(row0){ for(int i=0;i<n;i++){ matrix[0][i]=0; } } if(col0){ for(int i=0;i<m;i++){ matrix[i][0]=0; } } } }
這樣空間使用就到了O(1)