1. 程式人生 > 其它 >leetcode 73 矩陣置零

leetcode 73 矩陣置零

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)