算法练习:矩阵清零
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
相关文章推荐
- 我喜欢竞争系列1
- 微信公众平台开发_OAuth2.0网页授权
- uva 11374 Airport Express(Dijkstra)
- TCP/IP协议族-----8、地址解析协议(ARP)
- Win8.1安装VirtualSVN Server发生service visualSVN Server failed to start解决办法
- 使用touch事件实现手机网页右侧菜单栏拖动显示隐藏
- hdu 5273 Dylans loves sequence
- 时间编程--gettimeofday(获取高精度时间)
- POJ 1328 Radar Installation(贪心)
- 时间编程--asctime(以字符串方式显示时间)
- 在mvc中实现图片验证码的刷新
- iOS 音乐类App必备功能:后台播放、锁屏封面、远程播放控制
- 时间编程 --localtime(获取本地时间)
- 架构师速成7-高中
- 架构师速成7-高中 分类: 架构师速成 2015-06-21 19:17 132人阅读 评论(0) 收藏
- 第15周-阅读命名空间的使用
- 时间编程--获取格林威治时间 gmtime
- 开源高性能网络库Libevent的简介
- 读后感
- awk布尔操作符