首页 > 其他 > 详细

面试题 01.08. 零矩阵

时间:2020-05-09 23:36:48      阅读:59      评论:0      收藏:0      [点我收藏+]

题目:

技术分享图片

 

 

解答:

 常量空间的话,第一可以考虑是不是固定数量的几个变量能搞定;否则可以考虑是不是问题本身已经提供了足够的空间。
    这道题目属于后者,就是利用矩阵的第一行和第一列来作为辅助空间使用。不用开辟新的存储空间。方法就是:
    A. 先确定第一行和第一列是否需要清零;
    B. 扫描剩下的矩阵元素,如果遇到了0,就将对应的第一行和第一列上的元素赋值为0;
    C. 根据第一行和第一列的信息,已经可以将剩下的矩阵元素赋值为结果所需的值了;
    D. 根据1中确定的状态,处理第一行和第一列;

class Solution {
public:
    void setZeroes(vector<vector<int>>& matrix) 
    {
          int rows = matrix.size();
        if(0 == rows)
        {
            return;
        }
        int cols = matrix[0].size();
        if(0 == cols)
        {
            return;
        }
        //using first row and col as storage
        //1.search zero in first row and col to determin it‘s own status
        bool zerorow0 = false;
        bool zerocol0 = false;
        for(int ci = 0; ci < cols; ++ci)
        {
            if(matrix[0][ci] == 0)
            {
                zerorow0 = true;
                break;
            }
        }
        for(int ri = 0; ri < rows; ++ri)
        {
            if(matrix[ri][0] == 0)
            {
                zerocol0 = true;
                break;
            }
        }
        
        //2.search zeros in other position to sign the first row and col
        for(int ri = 1; ri < rows; ++ri)
        {
            for(int ci = 1; ci < cols; ++ci)
            {
                if(matrix[ri][ci] == 0)
                {
                    matrix[0][ci] = 0;
                    matrix[ri][0] = 0;
                }
            }
        }
        
        //3.set zeroes in other positions according to first col and row
        for(int ri = 1; ri < rows; ++ri)
        {
            for(int ci = 1; ci < cols; ++ci)
            {
                if(matrix[0][ci] == 0 || matrix[ri][0] == 0)
                {
                    matrix[ri][ci] = 0;
                }
            }
        }
        
        //4.set zeroes for first row and col
        if(zerorow0)
        {
            for(int ci = 0; ci < cols; ++ci)
            {
                matrix[0][ci] = 0;
            }
        }
        if(zerocol0)
        {
            for(int ri = 0; ri < rows; ++ri)
            {
                matrix[ri][0] = 0;
            }
        }

    }
};

 

面试题 01.08. 零矩阵

原文:https://www.cnblogs.com/ocpc/p/12861021.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!