01矩阵中,把0的点的行和列都置零

来自http://www.cnblogs.com/codingmylife/archive/2012/10/07/2714010.html,本人做了些注释,稍作修改,自己也实现了下,还挺有意思的
第一种方法用i,j存储记录有零的行,列,然后清空。第二种方法,比较巧妙,在O(1)空间上完成
#include <iostream>
#include <vector>
#include <utility>

using namespace std;
//题意是要求在01矩阵中,把0的点的行和列都置零。

void unguarded_setZero(int *matrix, int m, int n, int i, int j)
{
    for (int ii = 0; ii < m; ++ii)
    {
        *(matrix + ii * n + j) = 0;
    }

    for (int jj = 0; jj < n; ++jj)
    {
        *(matrix + i * n + jj) = 0;
    }
}

void solve(int *matrix, int m, int n)
{
    if (matrix == NULL || m <= 0 || n <= 0)
    {
        return;
    }

    vector<pair<int, int> > vecZero;  //存储为0的(行,列)值

    for (int i = 0; i < m; ++i)
    {
        for (int j = 0; j < n; ++j)
        {
            if (*(matrix + i * n  + j) == 0)
            {
                vecZero.push_back(make_pair(i, j));  //make_pair
            }
        }
    }

    for (vector<pair<int, int> >::const_iterator it = vecZero.begin();
        it != vecZero.end();
        ++it)
    {
        const int i = it->first;
        const int j = it->second;

        unguarded_setZero(matrix, m, n, i, j);
    }
}

int main(int argc, char **argv)
{
    int matrix[][6] =
    {
        {1, 1, 0, 1, 1, 1},
        {0, 1, 1, 1, 0, 1},
        {1, 1, 1, 1, 1, 1}
    };

    solve((int *)matrix, 3, 6);                 //sizeof()操作符返回是字节数
    int row =  sizeof(matrix)/sizeof(*matrix); //总共字节数除以一行的总字节数即行数
    int col = sizeof(*matrix)/sizeof(**matrix);  //一行字节数除以每个元素所占的字节 即是列数

    for (size_t i = 0; i < sizeof(matrix) / sizeof(*matrix); ++i)
    {
        for (size_t j = 0; j < sizeof(*matrix) / sizeof(**matrix); ++j)
        {
            cout << matrix[i][j] << " ";
        }

        cout << endl;
    }
    system("pause");
}
#include <iostream>
#include <vector>
#include <utility>

using namespace std;
//题意是要求在01矩阵中,把0的点的行和列都置零。这里要求空间复杂度为O(1)
void solve(int *matrix, int m, int n)
{
    if (matrix == NULL || m <= 0 || n <= 0)
    {
        return;
    }
    int row,col;
    bool row_0_flag =false;
    bool col_0_flag = false;
    for(col =0; col < n;col++)  //记录第0行的状态,以便最后赋值,但是有1的地方,对其他行列是有影响的
        if(!matrix[0*n + col])
        {
            row_0_flag = true;
            break;
        }
    for(row=0;row < m; row++) //第0列的状态,以便最后赋值,但是有1的地方,对其他行列是有影响的 
        if(!matrix[row*n + 0])
        {
            col_0_flag = true;
            break;
        }
    for(row = 1;row <m;row++)
        for(col = 1; col <n;col++)
        {
            if(!matrix[row*n +col])  //因为
            {
                matrix[0 * n + col] = 0;
                matrix[row * n +0] = 0;
            }
        }
    
     for(row =1;row <m;row++)
         for(col=1;col <n;col++)
         {
             if(!matrix[0*n+col] || !matrix[row*n +0])
                    matrix[row*n +col] = 0;
         }

    if(row_0_flag)
    {
        for(col=0;col<m;col++)
            matrix[0*m +col] =0;
    }
    if(col_0_flag)
    {
        for(row=0;row < n;row++)
            matrix[row*m +0] =0;
    }
}

int main(int argc, char **argv)
{
    int matrix[][6] =
    {
        {1, 1, 0, 1, 1, 1},
        {0, 1, 1, 1, 0, 1},
        {1, 1, 1, 1, 1, 1}
    };

    solve((int *)matrix, 3, 6);                 //sizeof()操作符返回是字节数
    int row =  sizeof(matrix)/sizeof(*matrix); //总共字节数除以一行的总字节数即行数
    int col = sizeof(*matrix)/sizeof(**matrix);  //一行字节数除以每个元素所占的字节 即是列数

    for (size_t i = 0; i < sizeof(matrix) / sizeof(*matrix); ++i)
    {
        for (size_t j = 0; j < sizeof(*matrix) / sizeof(**matrix); ++j)
        {
            cout << matrix[i][j] << " ";
        }

        cout << endl;
    }
    system("pause");
}
#include <iostream>
#include <vector>
#include <utility>
using namespace std;
//题意是要求在01矩阵中,把0的点的行和列都置零。这里空间复杂度为O(1)
void solve(int *matrix, int m, int n)
{
    if (matrix == NULL || m <= 0 || n <= 0)
    {
        return;
    }
    int row,col;
    bool row_0_flag =false;
    bool col_0_flag = false;
    for(col =0; col < n;col++)  //第0行
        if(!matrix[0*n + col])   //注意行,列,n是总列数,用来跳行
        {
            row_0_flag = true;
            break;
        }
    for(row=0;row < m; row++) //第0列
        if(!matrix[row*n + 0])
        {
            col_0_flag = true;
            break;
        }
    for(row = 1;row <m;row++)
        for(col = 1; col <n;col++)
        {
            if(!matrix[row*n +col])  //已经0行0列状态记录了,说明有0,可以设置
            {
                matrix[0 * n + col] = 0;
                matrix[row * n +0] = 0;
            }
        }
    
     for(row =1;row <m;row++)
         for(col=1;col <n;col++)
         {
             if(!matrix[0*n+col] || !matrix[row*n +0])  //0行,0列中有零的,对应要清零
                    matrix[row*n +col] = 0;
         }

    if(row_0_flag)  //要是开始就有0,则最后一起清空
    {
        for(col=0;col< n;col++)  //注意行,列
            matrix[0 * n +col] =0;
    }
    if(col_0_flag)  //要是开始就有0,则最后一起清空
    {
        for(row=0;row <m;row++)
            matrix[row*n +0] =0;
    }
}
原文地址:https://www.cnblogs.com/cheng07045406/p/3209621.html