二维数组置0问题学习记录

刚充值了一波信仰,贴篇代码过个瘾~今日高产赛母猪

前不久做了一道题,把一个二维数组内0所在行列都置0。

一开始写的是这样的:

for (int i = 0; i < m; ++i ) {
	for (int j = 0; j < n; ++j) {
		if ( 0 == ar[i][j]) {
			ar[i][0] == 0;
			ar[0][j] == 0;
		}
	}
]

for (int i = 0; i < m; ++i) {
	if ( 0 == ar[i][0]){
		for (int j = 0; j < n; ++j)
			ar[i][j] = 0
	}
}

for (int j = 0; j < n; ++j) {
	if ( 0 == ar[0][j]){
		for (int i = 0; i < m; ++i)
			ar[i][j] = 0
	}
}

然后被指出这段代码有很大的问题,它直接将0所在行列清0,后面会导致整个数组都变成0。于是在师兄指导下改为将遍历到0的行列记录 清空再继续检查。新代码如下:

void SetZero(int **data, int r, int c)
{ 
   /**
* Set_zero
* URL:
* 2017-1-21
*/

in *zeroCols = new int[c];//建立辅助空间 memset(zeroCols, 0, sizeof(int)*c); bool isZeroRow = false; //逐行查找0 for (int i = 0; i < r; i++) { isZeroRow = false; for (int j = 0; j < c; j++) { if (!data[i][j]) { isZeroRow = true; zeroCols[j] = 1; } } if (isZeroRow) { memset(data[i], 0, sizeof(int)*c);//清 } } //逐列查找0 for (int j = 0; j<c; j++) { if (zeroCols[j]) { for (int i = 0; i < r; i++) { data[i][j] = 0; } } } }

欢迎各位继续指正~

另外晒一波信仰哈哈

99599000366745980

431940182153597883

500191385218192562

667178930020410356

圣手二代104忍者白青轴 一本满足~

14 Comments

Name *

E-mail *

Website

  1. MG

    不买个键盘可能万年不更啦吧。。。

  2. chencool

    更新了,前排留名~

  3. 潇夜语

    机械键盘样子好古典..像小霸王

  4. ArchiTech

    在刷leetcode吗?这题可以完全不用extra space做哦 – https://discuss.leetcode.com/topic/5056/any-shorter-o-1-space-solution

    • 小蝴蝶

      @ArchiTech 是的!在leetcode又看到了这道题!

  5. 任务易

    你是妹子?还是程序员?

  6. 暮暮

    话说我用的是CODE Keyboard~StackOverflow创始人的品牌。。。超级适合程序员,一键切换mac与windows模式~总之各方面都炒鸡棒!

    • 小蝴蝶

      @暮暮 是可以一键stackoverflow吗 (笑

  7. Ray

    键盘不错

  8. Ray

    很青春的键盘

  9. Tokin

    竟然有更新

  10. 郑永

    这键盘给长到桌子高度的小孩子专用键盘,这样可以看到字母~~~