zoukankan      html  css  js  c++  java
  • Leetcode Set Matrix Zeroes

    Given a m x n matrix, if an element is 0, set its entire row and column to 0. Do it in place.

    click to show follow up.

    Follow up:

    Did you use extra space?
    A straight forward solution using O(mn) space is probably a bad idea.
    A simple improvement uses O(m + n) space, but still not the best solution.
    Could you devise a constant space solution?


    解题思路:

    This problem should be solved in place, i.e., no other array should be used. We can use the first column and the first row to track if a row/column should be set to 0.

    Since we used the first row and first column to mark the zero row/column, the original values are changed.

    Specifically, given, the following matrix

    this problem can be solved by following 4 steps:

    Step 1:
    First row contains zero = true;
    First column contains zero = false;

    Step 2: use first row and column to mark zero row and column.

    Step 3: set each elements by using marks in first row and column.

    Step 4: Set first column and row by using marks in step 1.


    Java code:

    public class Solution {
        public void setZeroes(int[][] matrix) {
            if(matrix == null || matrix.length == 0 || matrix[0].length == 0) {
                return;
            }
            boolean firstrowzero = false;
            boolean firstcolzero = false;
            int m = matrix.length, n = matrix[0].length;
            //set first row and column zero or not
            for(int i = 0; i < m ; i++) {
                if(matrix[i][0] == 0) {
                    firstcolzero = true;
                    break;
                }
            }
            for(int j = 0; j < n ; j++) {
                if(matrix[0][j] == 0) {
                    firstrowzero = true;
                    break;
                }
            }
            // find zeroes and store the info in first row and column
            for(int i = 1; i< m ; i++) {
                for(int j = 1; j < n; j++) {
                    if(matrix[i][j] == 0) {
                        matrix[i][0] = 0;
                        matrix[0][j] = 0;
                    }
                }
            }
            
            //set zeroes except the first row and column
            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;
                    }
                }
            }
            // set zeroes for first row and column if needed
            if(firstrowzero){
                for(int j = 0; j < n; j++) {
                    matrix[0][j] = 0;
                }
            }
            if(firstcolzero){
                for(int i = 0; i < m; i++) {
                    matrix[i][0] = 0;
                }
            }
        }
    }

    Reference:

    1. http://www.programcreek.com/2012/12/leetcode-set-matrix-zeroes-java/

  • 相关阅读:
    LeetCode 83. Remove Duplicates from Sorted List (从有序链表中去除重复项)
    LeetCode 21. Merge Two Sorted Lists (合并两个有序链表)
    LeetCode 720. Longest Word in Dictionary (字典里最长的单词)
    LeetCode 690. Employee Importance (职员的重要值)
    LeetCode 645. Set Mismatch (集合不匹配)
    LeetCode 500. Keyboard Row (键盘行)
    LeetCode 463. Island Perimeter (岛的周长)
    115.Distinct Subsequences
    55.Jump Game
    124.Binary Tree Maximum Path Sum
  • 原文地址:https://www.cnblogs.com/anne-vista/p/4960906.html
Copyright © 2011-2022 走看看