您的位置:首页 > 其它

算法练习:矩阵清零

2015-06-21 19:22 239 查看

问题描述

给定一个二维的m * n 矩阵,如果某个元素为0, 那么将其所在行和列的所有元素设为0。不允许使用额外的矩阵空间。

举例



由于不能使用额外的矩阵空间,那么只能考虑在矩阵本身了,从里面挑选出一行和一列来记录哪些行与列要清0即可。

首先找出第一个0元素,由题目要求可知这个0元素所在行与列都会被清空,因此可以利用这一行和这一列来记录要清0的信息。

代码实现

#include <iostream>
#include <iomanip>

using namespace std;

//数组寻址辅助函数
int& GetArrayVal( int* pMatrix, int nCol, int i, int j )
{
return *( pMatrix + i * nCol + j);
}

void ZeroClearingOnMatrix( int* pMatrix, int nRow, int nCol )
{
//查找第一个0元素
int m = -1, n = -1;
for( int i = 0; i < nRow; ++i )
{
for( int j = 0; j < nCol; ++j )
{
//if ( pMatrix[i][j] == 0 )
if ( GetArrayVal( pMatrix, nCol, i, j ) == 0 )
{
m = i;
n = j;
break;
}
}
if ( m != -1 && n != -1 )
{
break;
}
}
if ( m == -1 && n == -1 ) return;

//使用第一个0元素的行列记录需要清0的行和列
for( int i = 0; i < nRow; ++i )
{
for( int j = 0; j < nCol; ++j )
{
if ( GetArrayVal( pMatrix, nCol, i, j ) == 0 )
{
//标记要清0的行、列
GetArrayVal( pMatrix, nCol, m, j ) = 1;
GetArrayVal( pMatrix, nCol, i, n ) = 1;
//pMatrix[m][j] = 1;
//pMatrix[i]
= 1;
}
else
{
//扫描的过程中对m行、n列中非标记作用的数据清0
if ( i == m )
{
//pMatrix[m][j] = 0;
GetArrayVal( pMatrix, nCol, m, j ) = 0;
}

if ( j == n )
{
//pMatrix[i]
= 0;
GetArrayVal( pMatrix, nCol, i, n ) = 0;
}
}
}
}
//pMatrix[m]
= 0;
GetArrayVal( pMatrix, nCol, m, n ) = 0;

/////////////////////////////////
//开始扫描标记字段,进行清0操作
for( int i = 0; i < nCol; ++i )
{
//if ( pMatrix[m][i] != 0 )
if ( GetArrayVal( pMatrix, nCol, m, i ) != 0 )
{
for( int j = 0; j < nRow; ++j )
{
//pMatrix[i][j] = 0;
GetArrayVal( pMatrix, nCol, j, i ) = 0;
}
}
}
for( int i = 0; i < nRow; ++i )
{
//if ( pMatrix[i]
!= 0 )
if ( GetArrayVal( pMatrix, nCol, i, n ) != 0 )
{
for( int j = 0; j < nCol; ++j )
{
//pMatrix[i][j] = 0;
GetArrayVal( pMatrix, nCol, i, j ) = 0;
}
}

}
}

//打印数组辅助函数
void PrintMatrix( int* pMatrix, int nRow, int nCol )
{
for( int i = 0; i < nRow; ++i )
{
for( int j = 0; j < nCol; ++j )
{
//cout << pMatrix[i][j] << " ";
cout << left << setw(3) << GetArrayVal( pMatrix, nCol, i, j ) << " ";
}
cout << endl;
}
}

int main()
{
int mMatrix[3][4] = {
1, 0, 3, 4,
5, 6, 0, 8,
9, 10, 11, 12
};
cout << "原数组:" << endl;
PrintMatrix( (int*)mMatrix, 3, 4 );
ZeroClearingOnMatrix( (int*)mMatrix, 3, 4 );
cout << "清0处理后数组:" << endl;
PrintMatrix( (int*)mMatrix, 3, 4 );
cout << "---------------------------------------" << endl;

int mMatrix2[3][4] = {
1, 0, 3, 4,
5, 6, 0, 8,
9, 10, 11, 12
};
cout << "原数组:" << endl;
PrintMatrix( (int*)mMatrix2, 3, 4 );
ZeroClearingOnMatrix( (int*)mMatrix2, 3, 4 );
cout << "清0处理后数组:" << endl;
PrintMatrix( (int*)mMatrix2, 3, 4 );
cout << "---------------------------------------" << endl;

int mMatrix3[3][4] = {
1, 2, 3, 4,
5, 6, 4, 8,
9, 10, 11, 12
};
cout << "原数组:" << endl;
PrintMatrix( (int*)mMatrix3, 3, 4 );
ZeroClearingOnMatrix( (int*)mMatrix3, 3, 4 );
cout << "清0处理后数组:" << endl;
PrintMatrix( (int*)mMatrix3, 3, 4 );
cout << "---------------------------------------" << endl;

return 0;
}


测试运行



系列文章说明:

1.本系列文章[算法练习],仅仅是本人学习过程的一个记录以及自我激励,没有什么说教的意思。如果能给读者带来些许知识及感悟,那是我的荣幸。

2.本系列文章是本人学习陈东锋老师《进军硅谷,程序员面试揭秘》一书而写的一些心得体会,文章大多数观点均来自此书,特此说明!

3.文章之中,难免有诸多的错误与不足,欢迎读者批评指正,谢谢.

作者:山丘儿

转载请标明出处,谢谢。原文地址:http://blog.csdn.net/s634772208/article/details/46583597
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: