码迷,mamicode.com
首页 > 其他好文 > 详细

Set Matrix Zeros

时间:2015-07-25 12:01:16      阅读:139      评论:0      收藏:0      [点我收藏+]

标签:

问题描述

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

 

Set Matrix Zeros

标签:

原文地址:http://www.cnblogs.com/harrygogo/p/4675474.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!