LeetCode:Set Matrix Zeroes - 將矩陣內含有零的行和列所有置零

一、題目名稱java

Set Matrix Zeroes(將矩陣內含有零的行和列所有置零)
code

二、題目地址element

https://leetcode.com/problems/set-matrix-zeroes/
leetcode

三、題目內容開發

英文:Given a m x n matrix, if an element is 0, set its entire row and column to 0.get

中文:給定一個m×n的矩陣,若是其中一個元素是0,則將該元素所在的整行或整理所有置爲0hash

四、解題方法1it

使用第一行和第一列記錄某行或某列是否應置爲0,並再用兩個狀態位分別標記第一行和第一列是否也應該被置爲0.
io

Java代碼以下:class

/**
 * @功能說明:LeetCode 73 - Set Matrix Zeroes
 * @開發人員:Tsybius2014
 * @開發時間:2015年11月7日
 */
public class Solution {
    
    /**
     * 給定一個矩陣,將有0的行、列所有元素置0
     * @param matrix
     */
    public void setZeroes(int[][] matrix) {
        
        if (matrix == null || matrix.length == 0 || matrix[0].length == 0) {
            return;
        }
        
        int m = matrix.length;
        int n = matrix[0].length;
        
        boolean needFillFirstRow = false;
        boolean needFillFirstColumn = false;
        
        //找出含有0的行號和列號,記在該元素所在行列的第一個元素處
        for (int i = 0; i < m; i++) {
            for (int j = 0; j < n; j++) {
                if (matrix[i][j] == 0) {
                    if (i == 0) {
                        //若是某行第一個元素本來就爲0,記錄下這一點
                        needFillFirstRow = true;
                    }
                    if (j == 0) {
                        //若是某列第一個元素本來就爲0,記錄下這一點
                        needFillFirstColumn = true;
                    }
                    matrix[i][0] = 0;
                    matrix[0][j] = 0;
                }
            }
        }

        //按第一個元素的記錄狀況填充各行
        for (int j = 1; j < n; j++) {
            if (matrix[0][j] == 0) {
                for (int i = 0; i < m; i++) {
                    matrix[i][j] = 0;
                }
            }
        }

        //按第一個元素的記錄狀況填充各列
        for (int i = 1; i < m; i++) {
            if (matrix[i][0] == 0) {
                for (int j = 1; j < n; j++) {
                    matrix[i][j] = 0;
                }
            }
        }

        //確認是否須要填充第一行
        if (needFillFirstRow) {
            for (int j = 0; j < n; j++) {
                matrix[0][j] = 0;
            }
        }

        //確認是否須要填充第一列
        if (needFillFirstColumn) {
            for (int i = 0; i < m; i++) {
                matrix[i][0] = 0;
            }
        }
    }
}

五、解題方法2

另外一個方式是不使用矩陣內部的元素記錄這些變化。而是使用鏈表(LinkedList)或是Hash集合(HashSet)記錄那些行、列須要被置0。

使用LinkedList的Java代碼以下:

import java.util.LinkedList;

/**
 * @功能說明:LeetCode 73 - Set Matrix Zeroes
 * @開發人員:Tsybius2014
 * @開發時間:2015年11月7日
 */
public class Solution {
    
    /**
     * 給定一個矩陣,將有0的行、列所有元素置0
     * @param matrix
     */
    public void setZeroes(int[][] matrix) {
        
        if (matrix == null || matrix.length == 0 || matrix[0].length == 0) {
            return;
        }
        
        //鏈表,用於存儲行號和列號
        LinkedList<Integer> linkedListRows = new LinkedList<Integer>();
        LinkedList<Integer> linkedListColumns = new LinkedList<Integer>();
        
        int m = matrix.length;
        int n = matrix[0].length;
        
        //找出含有0的行號和列號
        for (int i = 0; i < m; i++) {
            for (int j = 0; j < n; j++) {
                if (matrix[i][j] == 0) {
                    linkedListRows.add(i);
                    linkedListColumns.add(j);
                }
            }
        }
        
        //將含有0的各行置0
        for (int i : linkedListRows) {
            for (int num = 0; num < n; num++) {
                matrix[i][num] = 0;
            }
        }
        
        //將含有0的各列置0
        for (int j : linkedListColumns) {
            for (int num = 0; num < m; num++) {
                matrix[num][j] = 0;
            }
        }
    }
}

使用HashSet的Java代碼以下:

import java.util.HashSet;

/**
 * @功能說明:LeetCode 73 - Set Matrix Zeroes
 * @開發人員:Tsybius2014
 * @開發時間:2015年11月7日
 */
public class Solution {
    
    /**
     * 給定一個矩陣,將有0的行、列所有元素置0
     * @param matrix
     */
    public void setZeroes(int[][] matrix) {
        
        if (matrix == null || matrix.length == 0 || matrix[0].length == 0) {
            return;
        }
        
        //鏈表,用於存儲行號和列號
        HashSet<Integer> hashSetRows = new HashSet<Integer>();
        HashSet<Integer> hashSetColumns = new HashSet<Integer>();
        
        int m = matrix.length;
        int n = matrix[0].length;
        
        //找出含有0的行號和列號
        for (int i = 0; i < m; i++) {
            for (int j = 0; j < n; j++) {
                if (matrix[i][j] == 0) {
                    hashSetRows.add(i);
                    hashSetColumns.add(j);
                }
            }
        }
        
        //將含有0的各行置0
        for (int i : hashSetRows) {
            for (int num = 0; num < n; num++) {
                matrix[i][num] = 0;
            }
        }
        
        //將含有0的各列置0
        for (int j : hashSetColumns) {
            for (int num = 0; num < m; num++) {
                matrix[num][j] = 0;
            }
        }
    }
}

END

相關文章
相關標籤/搜索