leetcode73矩阵置零

leetcode73 Set Matrix Zeroes

Posted by BY on March 12, 2019

前言

新的一年,好好学习

正文

问题来源

本问题来自leetcode上的73题。

问题描述

给定一个 m x n 的矩阵,如果一个元素为 0,则将其所在行和列的所有元素都设为 0。请使用原地算法。 (空间使用最少)

示例 1:

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

示例 2:

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

一个直接的解决方案是使用 O(mn) 的额外空间,但这并不是一个好的解决方案。 一个简单的改进方案是使用 O(m + n) 的额外空间,但这仍然不是最好的解决方案。 你能想出一个常数空间的解决方案吗?

分析:

以行循环时记录列标,然后再标记

func setZeroes(matrix [][]int)  {
	flag := false
	y := make([]int, 0)
	for i := 0; i < len(matrix); i++ {
		for j := 0; j < len(matrix[0]); j++ {
			if 0 == matrix[i][j] {
				y = append(y, j)
				flag = true
			}
		}
		if true == flag {
			for j := 0; j < len(matrix[0]); j++ {
				matrix[i][j] = 0
			}
		}
		flag = false
	}
	for i := 0; i < len(y); i++ {
		for j := 0; j < len(matrix); j++ {
			matrix[j][y[i]] = 0
		}
	}
}

这样写法的问题,一空间复杂度高,二没有去重行号。
网上给出的算法(python实现)
用第一行和第一列记录这一行和这一列中是否有零,当然,一开始要先用row和col记录第一行和第一列是否有零,最后再根据这个判断是否将第一行第一列置零

class Solution:
    # @param matrix, a list of lists of integers
    # @return nothing (void), do not return anything, MODIFY matrix IN PLACE.
    def setZeroes(self, matrix):
        if len(matrix) == 0:
            return ;
        row, col = 1, 1
        for i in range(0, len(matrix)):
            if matrix[i][0] == 0:
                col = 0
        for j in range(0, len(matrix[0])):
            if matrix[0][j] == 0:
                row = 0
        
        for i in range(1, len(matrix)):
            for j in range(1, len(matrix[0])):
                if matrix[i][j] == 0:
                    matrix[i][0] = 0
                    matrix[0][j] = 0
        for i in range(1, len(matrix)):
            for j in range(1, len(matrix[0])):
                if matrix[i][0] == 0 or matrix[0][j] == 0:
                    matrix[i][j] = 0
                    
        if col == 0:
            for i in range(0, len(matrix)):
                matrix[i][0] = 0
        if row == 0:
            for j in range(0, len(matrix[0])):
                matrix[0][j] = 0

总结:

勤思考。

结语

不管怎么样好好加油。