我的天。。。
這道題我連最簡單的暴力O(n^2)都沒想出來。 感覺有一種第一次就想追求optimal的solution, 暴力法的double loop想都沒去想。 感覺兩個For loop 表示subarray的方法在我腦袋里仿佛完全不存在一樣。。。
這個O(N)的算法就非常恐怖了。。。
先用一個count 變量來儲存 1's 和0's 抵消后的值,比如0就代表0s 和1s一樣多。用HashMap 記錄count的值,key為index。我花了不少時間才理解這個玩意的意思。
假設(shè)是同樣的count, 比如count =0. 可能是0011, 也可能是00001111 但是后者明顯更長一點。由于我們之前見過0011, 把count =0 存在hashmap里了。這次又遇到一個00001111, count =0的,我們可以用i - map.get(count)的key的值,也就是當前index-上一次index, 來知道這個continous array的長度, 然后和maxLen做比較。
疑問:因為我們只想知道equal number? of 0's 和1's的 array長度,那為什么map還要put count不等于0的時候?這是因為 如果從點i 到點i+n, count的數(shù)量回到了一個水平,那就代表這一段內(nèi)總的0,和1是一樣多的。這樣抵消之后才會使得count數(shù)量不變。所以i-map.get(count) 還是能告訴我們這段0,1數(shù)量一樣多的subarray的長度