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.

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?

把矩阵中0元素所在的行和列的所有元素都改成0.

public class Solution {
    public void setZeroes(int[][] matrix) {
         boolean firstRowZero = false;
		boolean firstColumnZero = false;
		// ------------------------------ 第一步
		// 标记第一行,列 是否有0
		/*
		 *  1	0	0	2	
			2	
			3	
			4	
		 */
		// firstRowZero = true, firstColumnZero = false;
		// set first row and column zero or not
		for (int i = 0; i < matrix.length; i++) {
			if (matrix[i][0] == 0) {
				firstColumnZero = true;
				break;
			}
		}

		for (int i = 0; i < matrix[0].length; i++) {
			if (matrix[0][i] == 0) {
				firstRowZero = true;
				break;
			}
		}
		// ------------------------------ End

		// ------------------------------ 第二步
		// 从行,列  各第二个数开始遍历,当遇到0,则把行,列 第一个数制成0
		/*
			0	3	4
			2	1	2
			5	6	7
		 */
		// 比如 i = 1, j = 1; 则 matrix[1][0] = 0, matrix[0][1] = 0
		/*
		 *  1	0	0	2	
			2	0	3	4	
			3	2	1	2	
			4	5	6	7
		 * 
		 * 原矩阵就成
		 * 
		 *  1	0	0	2	
			0	0	3	4	
			3	2	1	2	
			4	5	6	7
		 */
		// 此函数就是过滤出矩阵中所有带0的列和行,在第一行和第一列制成0做标记给下一函数用
		// mark zeros on first row and column
		for (int i = 1; i < matrix.length; i++) {
			for (int j = 1; j < matrix[0].length; j++) {
				if (matrix[i][j] == 0) {
					matrix[i][0] = 0;
					matrix[0][j] = 0;
				}
			}
		}
		
		// ------------------------------ End

		// ------------------------------ 第三步
		// 上个函数已经过滤掉所有带0的行和列,在这只需要遍历矩阵
		// 只要第一个行或列的第一位为0 就把行或列全制成0
		/*
		 * 上个函数过滤掉后成
		 * 
		 *  1	0	0	2	
			0	0	3	4
			3	2	1	2	
			4	5	6	7
		 */
		/*
		 * 这函数完,原矩阵就成
		 *  1	0	0	2	
			0	0	0	0
			3	0	0	2	
			4	0	0	7
		 */
		// use mark to set elements
		for (int i = 1; i < matrix.length; i++) {
			for (int j = 1; j < matrix[0].length; j++) {
				if (matrix[i][0] == 0 || matrix[0][j] == 0) {
					matrix[i][j] = 0;
				}
			}
		}
		// ------------------------------ End
		
		// ------------------------------ 第四步
		// 第一行和第一列的初始0,不应该参与2,3步操作,不然遍历整个矩阵,
		   //发现0元素之后就将这个元素所在的行和列都设置成0。所以整个矩阵都是0.
		// 所以一开始标记好第一行和第一列是否有0 且 以上操作都是从1开始遍历
		// 这函数就是如果有就替换掉对应的第一行或第一列
		/*
		 * 上个函数过滤掉后成
		 * 
		 *  1	0	0	2	
			0	0	0	0
			3	0	0	2	
			4	0	0	7
		 */
		/*
		 * 这函数完,原矩阵就成
		 *  0	0	0	0	
			0	0	0	0	
			3	0	0	2	
			4	0	0	7	
		 */
		// set first column and row
		if (firstColumnZero) {
			for (int i = 0; i < matrix.length; i++)
				matrix[i][0] = 0;
		}

		if (firstRowZero) {
			for (int i = 0; i < matrix[0].length; i++)
				matrix[0][i] = 0;
		}
		// ------------------------------ End
    }
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值