Loading

Leetcode - 73. 矩阵置零

给定一个m x n的矩阵,如果一个元素为0,则将其所在行和列的所有元素都设为0。请使用原地算法。
进阶:
一个直观的解决方案是使用 O(mn)的额外空间,但这并不是一个好的解决方案。
一个简单的改进方案是使用O(m + n)的额外空间,但这仍然不是最好的解决方案。
你能想出一个仅使用常量空间的解决方案吗?

示例 1:

输入:matrix = [[1,1,1],[1,0,1],[1,1,1]]
输出:[[1,0,1],[0,0,0],[1,0,1]]

示例 2:

输入:matrix = [[0,1,2,0],[3,4,5,2],[1,3,1,5]]
输出:[[0,0,0,0],[0,4,5,0],[0,3,1,0]]

提示:

  • m == matrix.length
  • n == matrix[0].length
  • 1 <= m, n <= 200
  • -231 <= matrix[i][j] <= 231 - 1

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/set-matrix-zeroes
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

解1 2021/9/10 O(mxn)

def setZeroes(matrix: list) -> None:
    """
    Do not return anything, modify matrix in-place instead.
    """
    '''
    1   1   1
    1   0   1
    1   1   1
    这题,直接遍历到0,更新hang lie,接着遍历到的0可能就不是原来本身的0了
    换个数就好了,matrix的元素是int,那就填inf,
    只不过不能用float('inf'),这是float类型,没法转成int,
    题目限定了matrix[i][j]∈[-2^31,2^31-1],那就填1<<32
    最后再遍历一遍,把inf换成0即可
    '''
    inf=(1<<32)
    m=matrix.__len__()
    n=matrix[0].__len__()
    if m==1 and n==1: return
    for x in range(0,m):
        for y in range(0,n):
            if matrix[x][y]==0:
                # update hang
                for j in range(0,n):
                    matrix[x][j]=inf if matrix[x][j] else 0
                # update lie
                for i in range(0,m):
                    matrix[i][y]=inf if matrix[i][y] else 0
                # 不用把[x][y]改回来,反正后面还会改一遍
    for x in range(0,m):
        for y in range(0,n):
            if matrix[x][y]==inf: matrix[x][y]=0
    # print(matrix)

if __name__ == '__main__':
    matrix = [[1, 1, 1], [1, 0, 1], [1, 1, 1]]
    setZeroes(matrix)
    matrix = [[0, 1, 2, 0], [3, 4, 5, 2], [1, 3, 1, 5]]
    setZeroes(matrix)
    matrix = [[0, 1, 2, 0]]
    setZeroes(matrix)
    matrix = [[1]]
    setZeroes(matrix)
    matrix = [[1],[2],[0],[9]]
    setZeroes(matrix)

posted @ 2021-09-10 07:54  wwcg2235  阅读(28)  评论(0)    收藏  举报