扯闲篇
为啥写这个题? 因为这题由简单到难坑真是多。值得记录下来好好研究研究
题目
Given a mxn matrix, if an element is 0, set its entire row and column to 0. Do it in place.
Follow up:
Did you use extra space?
A straight forward solution using O(mn) space is probably a bad idea.
A simple improvement uses O(m+n) space, but still not the best solution.
Could you devise a constant space solution?
分析
首先 O(mn) 咋解?
这太简单了,你就复制一个矩阵 然后所有的 0 在复制的矩阵里面做就可以了。
然后O(m+n) 咋解?
你想啊,不是O(mn)里面要复制矩阵嘛,但是我们分析一下就知道,我们不需要知道矩阵里每一个元素是什么,我们需要知道的是每一行每一列要不要设置成0 对吧?有思路了没?
所以就每一行存一个变量O(m),每一列存一个变量O(n),
第一次遍历, 当发现matrix[i][j] == 0的时候,行i标记 列j标记。
第二次遍历,当发现行i标记了,matrix[i][0->n]= 0;发现列j标记了,matrix[0->m][j] = 0 ;
结束
最后O(1)咋解?
好了问题就来了,我们怎么想出来这道题O(1)还能做呢?
因为我们之前发现第一次进化的时候有一个规律,就是我们需要用一个“什么东西”来保存行列是否标零这个状态。保存状态的这个变量本身是不能改变的。所以我们要用一个常数空间来保存这个状态,怎么办呢?
直接想没辙,改动一下呢?我需要把所有的状态都另开一个变量存下来还是可以用矩阵本身存一点,另开变量存一点呢?
看到这里肯定比我聪明的看官都知道要怎么做了。我们可以把[1->m][1->n]的状态用第一行和第一列来保存,为了避免覆写第一行和第一列,第一行和第一列的状态单独保存,这就是我们要的答案。代码附上
代码自己点开看哈~~ 这也是为了让大家看完了先想一想,像我一样上来就抄一定会抄错的
哪里容易错
1. 不容易想到最优解,或者看答案没看明白(汗。。)覆写了第一行和第一列,导致的结果是全部清零。
2. 在最后写第一行第一列的时候行列颠倒了,导致的结果的该清零的地方没有清零。