扯閑篇
為啥寫這個題? 因為這題由簡單到難坑真是多。值得記錄下來好好研究研究
題目
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. 在最后寫第一行第一列的時候行列顛倒了,導致的結果的該清零的地方沒有清零。