python每日一题 矩阵置0 中等难度

发布于:2025-08-29 ⋅ 阅读:(16) ⋅ 点赞:(0)

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

这道题麻烦的地方是要注意不能使得因为其他元素变为0的元素 再去影响其他元素 我先遍历整个矩阵标记为0的位置 直接置0

还有一点就是不能因为这个元素 使得其他本来应该影响到其他元素的 没有被影响

来写代码

class Solution(object):
    def setZeroes(self, matrix):
        m=len(matrix)
        n=len(matrix[0])
        for i in range(m):
            for j in range(n):
                if matrix[i][j]==0:
                    matrix[i][j]=True
        #要注意置为0的时候不能让其他的ture的变为0
        for i in range(m):
            for j in range(n):
                if matrix[i][j]==True:
                    matrix[i][j] =0#将这个元素先置为0
                    for t in range(n):
                        if matrix[i][t]!=True:
                            matrix[i][t]=0
                    for s in range(m):
                        if matrix[s][j]!=True:
                            matrix[s][j]=0
        return matrix
solution=Solution()
result=solution.setZeroes([[1,1,1],[1,0,1],[1,1,1]])
print(result)

结果是错误的 我有点迷茫 在第一轮的时候 我是设置好了 中间那个元素是true的 其他元素我也没有修改 然后等到下一轮的时候 只有中间那个元素是0 设置为true了我先将这个元素设置为0  然后在这一行的元素如果不是true的话 就设置为0 这一列也是 如果不是true的话 就设置为0 我不知道哪里出问题了 打印出来看看

[[1, 1, 1], [1, True, 1], [1, 1, 1]]
[[0, 0, 0], [0, 0, 0], [0, 0, 0]]

第一轮没啥问题 那么问题出在第二轮

for i in range(m):
    for j in range(n):
        if matrix[i][j]==True:
            matrix[i][j] =0#将这个元素先置为0
            for t in range(n):
                if matrix[i][t]!=True:
                    matrix[i][t]=0
            for s in range(m):
                if matrix[s][j]!=True:
                    matrix[s][j]=0

分析这个哪里出问题了?

okok没的问题 我彻底被自己蠢哭了 元素0就不是true啊 我真服了 忘记了数字对应的true和false的情况 我真想扇自己一巴掌

class Solution(object):
    def setZeroes(self, matrix):
        m=len(matrix)
        n=len(matrix[0])
        for i in range(m):
            for j in range(n):
                if matrix[i][j]==0:
                    matrix[i][j]='True'
        print(matrix)
        #要注意置为0的时候不能让其他的ture的变为0
        for i in range(m):
            for j in range(n):
                if matrix[i][j]=='True':
                    matrix[i][j] =0#将这个元素先置为0
                    for t in range(n):
                        if matrix[i][t]!='True':
                            matrix[i][t]=0
                    for s in range(m):
                        if matrix[s][j]!='True':
                            matrix[s][j]=0
        return matrix
solution=Solution()
result=solution.setZeroes([[1,1,1],[1,0,1],[1,1,1]])
print(result)

使用特殊一点的标记就行 我真的 我哭死 我的脑子全都是浆糊了 虽然这个通过了 但是效率很低 我们来进行优化 

就是我们应该是做过类似的题目的 就是使用矩阵本身进行存储 因为就算是使得矩阵全部置0 也只是m行n列 所以我使用m+n-1个元素绝对够了 也就是第一行第一列就是绝对够了 

就比如 matrix[i][j]==0 那么我就设置第一列的i素为‘z’ 就表示这一行是要变为0的 设置第一行的 为‘z’

表示这一列是要变为0的 但是要注意原本这个元素是不是0 如果是的话 先把这个的给置为0 

思考一下 这样会不会影响到第一行和第一列的 如果在这一列中有元素为0 那么在第一行的这个元素也应该为0 如果没有这行这列为0 那么也不会影响到第一行和第一列的元素 所以没有影响

所以先看在第一行第一列的是啥情况 然后再看其他位置的是啥情况 好的我们来写代码

class Solution(object):
    def setZeroes(self, matrix):
        m=len(matrix)
        n=len(matrix[0])
        flag=''
        flag1=''
        for i in range(m):
            if matrix[i][0]==0:
                matrix[i][0]='True'
                flag='True'#第0列
        for j in range(n):
                if matrix[0][j]==0:
                    matrix[0][j]='True'
                    flag1='True'#第0行
        print(matrix)
        for i in range(1,m):
            for j in range(1,n):
                if matrix[i][j]==0:
                    matrix[i][0]='True'
                    matrix[0][j] = 'True'
        for i in range(1,m):
            if matrix[i][0]=='True':
                matrix[i]=[0]*n
        for j in range(1,n):
            if matrix[0][j]=='True':
                for i in range(m):
                    matrix[i][j]=0
        print(flag,'+',flag1)
        if  flag=='True'  :
            for i in range(m):
                matrix[i][0]=0
        if flag1=='True'  :
            matrix[0] = [0]*n
        # 针对于这一行 其实针对的是列
        return matrix
solution=Solution()
result=solution.setZeroes([[0,1]])
print(result)

但是这个针对于[0,1]的情况就有问题 所以我们需要再分析一下 如果是[0,0]处为0 那么我认为是列为0设置为true了 那么列就改变不了了 所以这个要特殊处理

class Solution(object):

    def setZeroes(self, matrix):

        m=len(matrix)

        n=len(matrix[0])

        flag=''

        flag1=''

        for i in range(m):

            if matrix[i][0]==0:

                matrix[i][0]='True'

                flag = 'True'  # 第0列

                if i==0:

                    flag1='True'#在这里修改了一下

        for j in range(n):

                if matrix[0][j]==0:

                    matrix[0][j]='True'

                    flag1='True'#第0行

        print(matrix)

        for i in range(1,m):

            for j in range(1,n):

                if matrix[i][j]==0:

                    matrix[i][0]='True'

                    matrix[0][j] = 'True'

        for i in range(1,m):

            if matrix[i][0]=='True':

                matrix[i]=[0]*n

        for j in range(1,n):

            if matrix[0][j]=='True':

                for i in range(m):

                    matrix[i][j]=0

        print(flag,'+',flag1)

        if  flag=='True'  :

            for i in range(m):

                matrix[i][0]=0

        if flag1=='True'  :

            matrix[0] = [0]*n

        # 针对于这一行 其实针对的是列

        return matrix

solution=Solution()

result=solution.setZeroes([[0,1]])

print(result)

在写这个代码的过程中 也是进行了多次的修改 其中就有因为浅拷贝 深拷贝弄了很多的错误 这个大家自己可以去了解一下

但是很不幸的是 我修改之后的运行速度也依旧垃圾 我看了前面耗时少的 大部分都是使用集合 还是集合好啊 拿出来一个空间直接将进行标记就行 我们来分析一个例子

class Solution(object):
    def setZeroes(self, matrix):
        """
        :type matrix: List[List[int]]
        :rtype: None Do not return anything, modify matrix in-place instead.
        """
        rows = set()
        columns = set()#存起来
        for i in range(len(matrix)):
            for j in range(len(matrix[0])):
                if matrix[i][j] == 0:
                    rows.add(i)
                    columns.add(j)#记录
        for i in rows:#对这些列
            for j in range(len(matrix[0])):
                matrix[i][j] = 0
        for j in columns:#对这些行
            for i in range(len(matrix)):
                matrix[i][j] = 0

可以的 兄弟们 都可以的 

如果喜欢这个帖子 欢迎点赞收藏 俺虽然用了最傻呗的方法 但是起码还是做出来了 泪目了


网站公告

今日签到

点亮在社区的每一天
去签到