首页 > 试题广场 >

清除行列

[编程题]清除行列
  • 热度指数:29202 时间限制:C/C++ 3秒,其他语言6秒 空间限制:C/C++ 32M,其他语言64M
  • 算法知识视频讲解

给定一个N阶方阵int[][](C++中为vector<vector><int>>)mat及其阶数n,若方阵中某个元素为0,则将其所在的行与列清零。返回改变后的int[][]方阵(C++中为vector<vector><int>>),保证n小于等于300,矩阵中的元素在nt范围内。</int></vector></int></vector>

测试样例:
[[1,2,3],[0,1,2],[0,0,1]]
返回:[[0,0,3],[0,0,0],[0,0,0]]
推荐

//楼上的Java版本有点复杂,写了个简单点的。
publicclassClearer {
    publicint[][] clearZero(int[][] mat, intn) {
        // write code here
        boolean[] rowArray = newboolean[n];
        boolean[] columnArray = newboolean[n];
         //记录为0的位置,把相应的行列位置设为true
        for(inti=0; i<n;i++)
        {
            for(intj=0;j<n;j++)
            {
                if(mat[i][j]==0)
                {
                    rowArray[i]=true;
                    columnArray[j]=true;
                }
            }         
        }
         //遍历找到之前记录的位置,把相应行列赋值为0
        for(inti=0;i<n;i++)
        {
            for(intj=0;j<n;j++)
            {
                if(rowArray[i]||columnArray[j])
                {
                mat[i][j] = 0;
                }
            }
        }
        returnmat;
    }
}

编辑于 2015-08-18 20:38:06 回复(15)
class Clearer:
    def clearZero(self, mat, n):
        import copy
        B = copy.deepcopy(mat)
        for i in range(n):
            for j in range(n):
                if mat[i][j] == 0:
                    B[i] = [0]*n
                    for k in range(n):
                        B[k][j] = 0
        return B

发表于 2020-08-21 13:38:31 回复(0)
class Clearer:
    def clearZero(self, mat, n):
        # write code here
        line = []
        rank = []
        for i in range(n):
            for j in range(n):
                if mat[i][j] == 0:
                    line.append(i)
                    rank.append(j)
        line = set(line)
        rank = set(rank)
        #print(line,rank)
        for i in line:
            for j in range(n):
                mat[i][j] = 0
        for i in rank:
            for j in range(n):
                mat[j][i] = 0
        return mat
标记出0的坐标,然后去除重复的行列,然后设置值为0
发表于 2019-02-27 16:39:16 回复(0)
    def clearZero(self, mat, n):
        # write code here
        tma = list(zip(*mat))
        lis = [[0 for col in range(n)] for row in range(n)]
        for i in range(n):
            for j in range(n):
                if 0 not in mat[i]:  #判定横列没有存在0
                    if 0 not in tma[j]:  #判定竖列没有存在0
                        lis[i][j] = mat[i][j]
        return lis
思路: 反向寻找横列都不为0的那个数字的位置. 然后放到全为0的***数组中.
发表于 2017-12-26 12:33:24 回复(0)

python solution:


class Clearer:
    def clearZero(self, mat, n):

        row=set()
        col=set()
        for i,v in enumerate(mat):
            for j,k in enumerate(v):
                if k==0:
                    row.add(i)
                    col.add(j)
        for i in row:
            for k in range(len(mat[0])):
                mat[i][k]=0
        for i in col:
            for k in range(len(mat)):
                mat[k][i]=0
        return mat
发表于 2017-10-03 17:44:57 回复(0)
class Clearer:
    def clearZero(self, mat, n):
        # write code here
        if not mat:
            return
        mat1 = zip(*mat)
        column = []
        row = []
        for i in range(n):
            if 0 in mat[i]:
                row.append(i)
            if 0 in mat1[i]:
                column.append(i)
        for each in row:
            mat[each] = [0]*n
        mat = zip(*mat)
        for each in column:
            mat[each] = [0]*n
        return zip(*mat)

发表于 2017-05-08 10:57:31 回复(0)
思路:
  • 用两个数组来统计哪行哪列为0
# -*- coding:utf-8 -*-
class Clearer:
    def clearZero(self, mat, n):
        if not mat:
            return []
        m = len(mat[0])
        vi = [False] * n
        vj = [False] * m

        for i in xrange(n):
            for j in xrange(m):
                if mat[i][j] == 0:
                    vi[i] = True
                    vj[j] = True
        for i in xrange(n):
            for j in xrange(m):
                if vi[i] or vj[j]:
                    mat[i][j] = 0

        return mat 


发表于 2016-08-01 20:33:58 回复(0)

问题信息

难度:
6条回答 24045浏览

热门推荐

通过挑战的用户

查看代码