code第一部分数组:第十九题 矩阵元素为0,横列置零

code第一部分数组:第十九题 矩阵元素为0,横列置零

 

 

分析
O(m + n) 空间的方法很简单,设置两个数组,记录每行和每列是否存在 0。
 
void zero(int **a, int m, int n){
    bool row[m], col[n];   
    memset(row, false, sizeof(row));
    memset(col, false, sizeof(col));   
    for(int i=0; i<m; ++i)
        for(int j=0; j<n; ++j)
            if(a[i][j] == 0){
                row[i] = true;
                col[j] = true;
            }
    for(int i=0; i<m; ++i)
        for(int j=0; j<n; ++j)
            if(row[i] || col[j])
                a[i][j] = 0;
}

void setZeroes(vector<vector<int> > &matrix)
{
    const size_t m = matrix.size();
    const size_t n = matrix[0].size();
    bool row_has_zero = false; // 第一行是否存在 0
    bool col_has_zero = false; // 第一列是否存在 0
    for (size_t i = 0; i < n; i++)
    if (matrix[0][i] == 0)
    {
        row_has_zero = true;
        break;
    }
    for (size_t i = 0; i < m; i++)
    {
        if (matrix[i][0] == 0) {
        col_has_zero = true;
        break;
    }
    for (size_t i = 1; i < m; i++)
    {
        for (size_t j = 1; j < n; j++)
        {
            if (matrix[i][j] == 0)
            {
                matrix[0][j] = 0;
                matrix[i][0] = 0;
            }

        }

    }
    for (size_t i = 1; i < m; i++)
    {
        for (size_t j = 1; j < n; j++)
        {
            if (matrix[i][0] == 0 || matrix[0][j] == 0)
            {
                matrix[i][j] = 0;
            }
        }
    }
    if (row_has_zero)
    {
        for (size_t i = 0; i < n; i++)
        {
            matrix[0][i] = 0;
        }
    }
    if (col_has_zero)
    {
        for (size_t i = 0; i < m; i++)
        {
            matrix[i][0] = 0;
        }
    }

}

 

posted @ 2017-02-25 22:15  taoliu_alex  阅读(260)  评论(0编辑  收藏  举报