问题描述
给定一个二维的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][n] = 1;
}
else
{
//扫描的过程中对m行、n列中非标记作用的数据清0
if ( i == m )
{
//pMatrix[m][j] = 0;
GetArrayVal( pMatrix, nCol, m, j ) = 0;
}
if ( j == n )
{
//pMatrix[i][n] = 0;
GetArrayVal( pMatrix, nCol, i, n ) = 0;
}
}
}
}
//pMatrix[m][n] = 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][n] != 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