打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
程序员面试金典1.7 清除行列
题目描述

请编写一个算法,若N阶方阵中某个元素为0,则将其所在的行与列清零。

给定一个N阶方阵int[][](C++中为vector<>>)mat和矩阵的阶数n,请返回完成操作后的int[][]方阵(C++中为vector<>>),保证n小于等于300,矩阵中的元素为int范围内。

测试样例:
[[1,2,3],[0,1,2],[0,0,1]]
返回:[[0,0,3],[0,0,0],[0,0,0]]
链接:https://www.nowcoder.com/questionTerminal/c95aac1506574dfc8ad44c3939c6739d
来源:牛客网

思路1,就是采用两个bool型数组,记录下有0 的行和列。然后分别清除行和列。
时间复杂度0(n^2),但是遍历了两遍,空间复杂度0(n);
下面的方法2,空间复杂度进一步降低,只要两个变量解决问题,空间复杂度0(1)。*/
class Clearer {
public:
    vector<vector<int> > clearZero(vector<vector<int> > mat, int n) {
        // write code here
        if(mat.size()<=0) return mat;
        //记录行和列的0
        bool* row=new bool[mat.size()];
        bool* col=new bool[mat[0].size()];
        //初始化一下
        for(unsigned int i=0;i<mat.size();i++)
            row[i]=false;
        for(unsigned int i=0;i<mat[0].size();i++)
            col[i]=false;
        //第一遍遍历元素,统计并标记0的行、列;
        for(unsigned int i=0;i<mat.size();i++)
        {
            for(unsigned int j=0;j<mat[0].size();j++)
            {
                if(mat[i][j]==0)
                {
                    row[i]=true;
                    col[j]=true;
                }
            }
        }
        //对应的位置置为0
        for(unsigned int i=0;i<mat.size();i++)
        {
            for(unsigned int j=0;j<mat[0].size();j++)
            {
                if(row[i]||col[j])
                    mat[i][j]=0;
            }
        }
        return mat;
    }
};


首先说下:vector<vector<int> > mat,
mat:表示二维数组,
//10行,5列
vector<vector<int>> a(10, vector<int>(5));
cout << "行"<< a.size() << endl;
cout << "列" << a[0].size() << endl;
cout << "列" << a[1].size() << endl;
//a[].size()表示列,括号里,添几都是一样的,因为列数一样。


本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
90 f0311 有问题
C++(后台开发面试题)
Mat, vector,Iplimage等等常见类型转换
C#使用OpenCV
基本算法-归并排序
【精选】【C++数据结构】vector_c++ vector 结构体
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服