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;
			}
		}
    }
}

 

posted @ 2015-07-25 10:49  Chapter  阅读(145)  评论(0编辑  收藏  举报