LeetCode——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.

  • Example 1:
    Input:
    [
    [1,1,1],
    [1,0,1],
    [1,1,1]
    ]
    Output:
    [
    [1,0,1],
    [0,0,0],
    [1,0,1]
    ]
  • Example 2:
    Input:
    [
    [0,1,2,0],
    [3,4,5,2],
    [1,3,1,5]
    ]
    Output:
    [
    [0,0,0,0],
    [0,4,5,0],
    [0,3,1,0]
    ]
  • Follow up:
    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,将结果保存在布尔值col和row中,然后从(1,1)开始遍历数组,如果为零,则把那一行和那一列的第一位置零,表示这一行和这一列需要置零。遍历完后再根据首行后首列是否为零来处理数组中的值,最后还要根据col和row判断是否要将第一行和第一列置0.

public void setZeroes(int[][] matrix) {
		if(matrix==null||matrix.length==0)
			return;
		int n=matrix.length;
		int m=matrix[0].length;
		boolean col=false;
		boolean row=false;
		for(int i=0;i<n;i++)
			if(matrix[i][0]==0)
				col=true;
		for(int i=0;i<m;i++)
			if(matrix[0][i]==0)
				row=true;
		for(int i=1;i<n;i++)
			for(int j=1;j<m;j++)
				if(matrix[i][j]==0)
				{
					matrix[i][0]=0;
					matrix[0][j]=0;
				}
		for(int i=1;i<n;i++)
		{
			if(matrix[i][0]==0)
				Arrays.fill(matrix[i], 0);
		}
		for(int i=1;i<m;i++)
			if(matrix[0][i]==0)
				for(int j=1;j<n;j++)
					matrix[j][i]=0;
		if(row)
			Arrays.fill(matrix[0], 0);
		if(col)
			for(int i=0;i<n;i++)
				matrix[i][0]=0;
    }

Runtime: 0 ms, faster than 100.00% of Java online submissions for Set Matrix Zeroes.
Memory Usage: 42.2 MB, less than 85.69% of Java online submissions for Set Matrix Zeroes.

解法二

这种方法更为简单,用k记录第一行中是否有0,遍历数组从(1,0)开始,纸条过第一行但不跳过第一列,如果数据为零,则令该数所在行和所在列的第一个数字为零。然后再次遍历数组i从1开始,j从m-1开始,倒过来处理,因为j如果从0开始处理 那么同一列后面的数据将可能错误的设置为0.

public void setZeroes(int[][] matrix) {
		if(matrix==null||matrix.length==0)
			return;
		int n=matrix.length;
		int m=matrix[0].length;
		int k=0;
		while(k<m&&matrix[0][k]!=0)
			++k;
		for(int i=1;i<n;i++)
			for(int j=0;j<m;j++)
				if(matrix[i][j]==0)
					matrix[i][0]=matrix[0][j]=0;
		for(int i=1;i<n;i++)
			for(int j=m-1;j>=0;j--)
				if(matrix[0][j]==0||matrix[i][0]==0)
					matrix[i][j]=0;
		if(k<m)
			Arrays.fill(matrix[0], 0);
	}

Runtime: 1 ms, faster than 95.61% of Java online submissions for Set Matrix Zeroes.
Memory Usage: 45.7 MB, less than 49.35% of Java online submissions for Set Matrix Zeroes.

python

class Solution:
    def setZeroes(self, matrix: List[List[int]]) -> None:
        """
        Do not return anything, modify matrix in-place instead.
        """
        if not matrix:
            return
        n,m,k=len(matrix),len(matrix[0]),0
        while k<m and matrix[0][k]:
            k=k+1
        for i in range(1,n):
            for j in range(m):
                if not matrix[i][j]:
                    matrix[i][0]=matrix[0][j]=0
        for i in range(1,n):
            for j in range(m-1,-1,-1):
                if not matrix[i][0] or not matrix[0][j]:
                    matrix[i][j]=0
        if k<m:
            matrix[0]=[0]*m
            
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值