码迷,mamicode.com
首页 > 其他好文 > 详细

Set Matrix Zeroes

时间:2015-06-13 09:52:50      阅读:110      评论:0      收藏:0      [点我收藏+]

标签:

Given a m x n matrix, if an element is 0, set its entire row and column to 0. Do it in place.

题目解析:

将一个矩阵中0所在行,以及所在列都置为0.

方法一:

将矩阵中,0的行和列的下标保存下来,并且分别去除里面重复的下标,之后遍历矩阵,将记录的这些行和列均置为0.代码如下:
class Solution {
public:
    bool exit_col(vector<int> col_dex,int col)
    {
        vector<int>::iterator s=find(col_dex.begin(),col_dex.end(),col);//第一个参数是array的起始地址,第二个参数是array的结束地址
    if( s !=col_dex.end())//找到
    return true;
    return false;
    }
    void setZeroes(vector<vector<int>>& matrix) {
        if(matrix.size()==0) return;
        int m=matrix.size();
        int n=matrix[0].size();
        vector<int> col_dex;
        vector<int> row_dex;
        bool flag=0;
        for(int row=0;row<m;row++)
        {
            for(int col=0;col<n;col++)
            {
               if(matrix[row][col]==0)
               {
                   if(!exit_col(col_dex,col))
                   col_dex.push_back(col);
                    if(!exit_col(row_dex,row))
                   row_dex.push_back(row);
               }
            }
        }
        for(int i=0;i<row_dex.size();i++)
        {
            for(int j=0;j<n;j++)
            matrix[row_dex[i]][j]=0;
        }
        for(int i=0;i<col_dex.size();i++)
        {
            for(int j=0;j<m;j++)
            matrix[j][col_dex[i]]=0;
        }
    }
};

方法二:

将有0出现的元素的所在行的第一个元素,和所在列的第一个元素置为0,因为当零出现时,这些都将置为0,是相同的,起先只将第一个元素置为0,起到了标记的作用。之后从右下方向上遍历矩阵,如果此元素所在行或者所在列的第一个元素为0,则将该元素置0.代码如下:
class Solution {
public:
    void setZeroes(vector<vector<int>>& matrix) {
        if(matrix.size()==0) return;
        int m=matrix.size();
        int n=matrix[0].size();
        int flag=1;
        for(int row=0;row<m;row++)
        {
            if(matrix[row][0]==0) flag=0;
            for(int col=1;col<n;col++)
            {
               if(matrix[row][col]==0)
               {
                   matrix[row][0]=0;
                   matrix[0][col]=0;
               }
            }
        }
        for(int row=m-1;row>=0;row--)
        {
            for(int col=n-1;col>=1;col--)
            {
               if(matrix[row][0]==0||matrix[0][col]==0)
               {
                   matrix[row][col]=0;
               }
            }
            if(flag==0) matrix[row][0]=0;
        }
        
    }
};

值得注意的是:在方法二中,列都是从第二个元素开始,到第二个元素截至,第一个元素特殊处理,这是为了防止第一行或者第一列的元素中本身就有0,造成的过多置0情况。如下:
1  1   2
0   1   2
如果不特殊处理将变成:
0   0   0
0   0   0
做特殊处理之后,只有matrix[row][0]=0;其他的matrix[row][j]不改变;如下:
0  1   2
0   0   0

Set Matrix Zeroes

标签:

原文地址:http://blog.csdn.net/sinat_24520925/article/details/46476625

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!