算法练习:矩阵清零

问题描述

给定一个二维的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


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值