567. 992. | 滑動窗口題型

分析:
? 比較典型的判斷一個字符串是否是另一個字符串的子串的問題。
? 這題最直接的思路就是移動窗口,每移動一次對窗口內(nèi)的字符串進(jìn)行判斷,是否是第一個字符串的排列。
? 我們使用兩個哈希表存儲字符串s1和s2的窗口,每次只要比較兩個哈希表是否相等即可。
? 注意,題目并沒有說s1一定小于等于s2,所以我們需要有一個判斷 s1 > s2?,是的話直接返回false。



分析:
? 題目求的是數(shù)組中滿足不同整數(shù)為K個的連續(xù)子數(shù)組的個數(shù)。
? 可見,窗口大小為K到A.size(),最直接的解法也就是暴力解法,我們從窗口K開始,K=A.size()結(jié)束,依次遍歷整個數(shù)組,計(jì)算全部子數(shù)組是否符合條件。

? 暴力解法超時的原因大多數(shù)都是因?yàn)榇罅恐貜?fù)計(jì)算,所以我們優(yōu)化的方向就是盡可能的將重復(fù)的部分給剔除掉。
? 我們觀察發(fā)現(xiàn),如果先將right指針向右移動,然后再將left指針右移,依次對當(dāng)前窗口K里面的子數(shù)組進(jìn)行遍歷計(jì)算,會大大的減少重復(fù)計(jì)算量。
? 總結(jié)歸納為以下兩個要點(diǎn):
對當(dāng)前窗口,若新加入元素后,不重復(fù)數(shù)字大于K,則縮小窗口大小,即 left++,right不變
對當(dāng)前窗口,若新加入元素后,不重復(fù)數(shù)字等于K,則計(jì)算當(dāng)前窗口好子數(shù)組的數(shù)量,并在計(jì)算結(jié)束后恢復(fù)窗口數(shù)據(jù)。
? 由于我們每次都是在加入新元素后才計(jì)算,所以不會重復(fù)計(jì)算之前已經(jīng)算過的好子數(shù)組數(shù)量,這樣可以大大減少計(jì)算量,將時間復(fù)雜度降低。
? 圖解:

? 注意,我們在移動計(jì)算好子數(shù)組的時候,哈希表只是作為臨時計(jì)算用的,在計(jì)算完之后一定要恢復(fù)數(shù)據(jù)。

? ? 最后膜拜一下大神的解法:
