Set Matrix Zeroes 把一个矩阵置为0 @LeetCode

本文介绍了一种方法,用于将矩阵中所有值为零的元素所在行和列置零,实现过程通过标记首行首列来优化空间复杂度。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一个m*n的矩阵,如果某元素为0,则把它的行和列都设为0

写的比较繁琐,但思路还是很清晰的。:)

package Level3;

/**
 * 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?
 *
 */
public class S73 {

	public static void main(String[] args) {
		int[][] matrix = {{0,0,0,5},
								{4,3,1,4},
								{0,1,1,4},
								{1,2,1,3},
								{0,0,1,1}};
		
		setZeroes(matrix);
	}
	
	public static void setZeroes(int[][] matrix) {
		
		// 用来标记第一行和第一列是否在一开始就有0的存在
		boolean rowZero = false, colZero = false;
		
		for(int i=0; i<matrix.length; i++){
			if(matrix[i][0] == 0){
				colZero = true;
				break;
			}
		}
		
		for(int j=0; j<matrix[0].length; j++){
			if(matrix[0][j] == 0){
				rowZero = true;
				break;
			}
		}
		
		// 在矩阵中查找0,标记在行头和列头
		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;
				}
			}
		}
		
		// 根据列头,把矩阵相应位置置零
		for(int i=1; i<matrix.length; i++){
			if(matrix[i][0] == 0){
				for(int j=1; j<matrix[0].length; j++){
					matrix[i][j] = 0;
				}
			}
		}
		
		// 根据行头,把矩阵相应位置置零
		for(int j=1; j<matrix[0].length; j++){
			if(matrix[0][j] == 0){
				for(int i=1; i<matrix.length; i++){
					matrix[i][j] = 0;
				}
			}
		}
		
		// 处理第一行
		if(rowZero){
			for(int j=0; j<matrix[0].length; j++){
				matrix[0][j] = 0;
			}
		}
		
		// 处理第一列
		if(colZero){
			for(int i=0; i<matrix.length; i++){
				matrix[i][0] = 0;
			}
		}
    }

}


public class Solution {
    public void setZeroes(int[][] matrix) {
        int rows = matrix.length;
        int cols = matrix[0].length;
        boolean rowZero=false, colZero=false;       // first row and col
        for(int i=0; i<rows; i++){
            if(matrix[i][0] == 0){
                colZero = true;
            }
        }
        for(int j=0; j<cols; j++){
            if(matrix[0][j] == 0){
                rowZero = true;
            }
        }
        
        for(int i=1; i<rows; i++){
            for(int j=1; j<cols; j++){
                if(matrix[i][j] == 0){
                    matrix[i][0] = 0;
                    matrix[0][j] = 0;
                }
            }
        }
        
        for(int i=1; i<rows; i++){
            if(matrix[i][0] == 0){
                for(int j=1; j<cols; j++){
                    matrix[i][j] = 0;
                }
            }
        }
        for(int j=1; j<cols; j++){
            if(matrix[0][j] == 0){
                for(int i=1; i<rows; i++){
                    matrix[i][j] = 0;
                }
            }
        }
        
        if(rowZero){
            for(int j=0; j<cols; j++){
                matrix[0][j] = 0;
            }
        }
        if(colZero){
            for(int i=0; i<rows; i++){
                matrix[i][0] = 0;
            }
        }
    }
}




评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值