zoukankan      html  css  js  c++  java
  • Set Matrix Zeros

    问题描述

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

    解决思路

    难点在于如何不使用辅助空间。

    一个巧妙的想法是,

    1. 使用两个标记变量,row0_has_zeros和col0_has_zeros分别表示矩阵中的第一行和第一列中是否包含0元素;

    2. 从矩阵的内层元素开始遍历,如果矩阵元素为0,则将相应的第一行和第一列对齐元素置为0;

    3. 再从矩阵的内层元素开始遍历,遍历的过程中,检查对应的第一行和第一列元素是否为0,如果为0则将该元素置为0;

    4. 最后根据两个标记变量,决定是否需要将第一行和第一列的元素全部都置为0.

    时间复杂度为O(n^2),空间复杂度为O(1).

    程序

    public class Solution {
        public void setZeroes(int[][] matrix) {
            if (matrix == null || matrix.length == 0 || matrix[0].length == 0) {
    			return;
    		}
    		
    		boolean row0_has_zeros = false;
    		boolean col0_has_zeros = false;
    		
    		for (int i = 0; i < matrix[0].length; i++) {
    			if (matrix[0][i] == 0) {
    				row0_has_zeros = true;
    				break;
    			}
    		}
    		
    		for (int i = 0; i < matrix.length; i++) {
    			if (matrix[i][0] == 0) {
    				col0_has_zeros = true;
    				break;
    			}
    		}
    		
    		for (int i = 1; i < matrix.length; i++) {
    			for (int j = 1; j < matrix[0].length; j++) {
    				if (matrix[i][j] == 0) {
    					matrix[0][j] = 0;
    					matrix[i][0] = 0;
    				}
    			}
    		}
    		
    		for (int i = 1; i < matrix.length; i++) {
    			for (int j = 1; j < matrix[0].length; j++) {
    				if (matrix[0][j] == 0 || matrix[i][0] == 0) {
    					matrix[i][j] = 0;
    				}
    			}
    		}
    		
    		if (row0_has_zeros) {
    			for (int i = 0; i < matrix[0].length; i++) {
    				matrix[0][i] = 0;
    			}
    		}
    		
    		if (col0_has_zeros) {
    			for (int i = 0; i < matrix.length; i++) {
    				matrix[i][0] = 0;
    			}
    		}
        }
    }
    
  • 相关阅读:
    java第一次作业
    第十一次作业
    第十次作业
    第九次作业
    第八次作业
    第七次作业
    第六次作业
    第五次作业
    实验四,实验五
    Java_实验二
  • 原文地址:https://www.cnblogs.com/harrygogo/p/4675474.html
Copyright © 2011-2022 走看看