zoukankan      html  css  js  c++  java
  • 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;
        }
    }
  • 相关阅读:
    Button 使用Command 按钮置灰未更新
    C# TextBox 焦点
    MultiTigger 绑定异常处理
    C# 获取程序路径
    Linux 权限设置chmod
    WPF SpreadSheetGear电子表单
    WPF 窗口
    Excel公式 提取文件路径后缀
    C#/VB.NET 获取电脑属性(硬盘ID、硬盘容量、Cpu序列号、MAC地址、系统类型)
    DevExpress Carousel 设置水平滑动列表
  • 原文地址:https://www.cnblogs.com/cheng07045406/p/3209621.html
Copyright © 2011-2022 走看看