LeetCode Day8 滑動視窗

2021-10-21 14:51:38 字數 1702 閱讀 8151

①s是個「a~z」無限環繞的字串,引數中也沒有顯式給出s。

②給定字串p,尋找s中p的不同子串,即p的子串數目,注意子串,即要求連續。

首先,p的子串怎樣在s中找到,要注意到s中的相鄰字元有兩種情況,一是差值為1,另一種是z和a相鄰。

如果p非空,以「bzab」為例,顯然p[0]=b一定是乙個子串,再接著看p[1]=z,p[1]不滿足上述兩種情況,則「bz」不是子串,"z"為子串,接著p[2]=a,滿足條件,則增加的子串為「a」,「za」,接著p[3]=b,滿足條件,增加的子串為「b」,「ab」,「zab」。我們可以發現在連續滿足條件的情況下,乙個字元增加子串數為1,兩個增加數為2,3個為3…,因此我們考慮用pre來記錄當前增加的子串數,同時pre也是以當前p[i]為尾的子串數。迴圈判斷,初始pre設定為1(因為單個字元必構成子串),只要滿足條件,pre+1,不滿足條件,pre重置為1,將所有的pre累加即為結果。

題目中要求的是子串的種類數,上述的pre是所有的子串數,可以使用雜湊表記錄以p[i]為尾的子串數,例如「bzab」,以z為尾的子串數為1,a為2,b為3,結果即為1+2+3=6.

class solution 

for(

auto c:hash)

count+

=c.second;

}else

return0;

return count;}}

;

給定陣列a,l,r,求的是滿足子陣列中最大元素滿足》=l&&<=r,要注意只要最大元素滿足條件即可,且子陣列元素要連續。

先考慮如果要求最大元素滿足<=r的情況,和上題思路類似,以[2, 1, 4, 3]為例,假設r=4,首先2<4,增加子陣列為;接著1<4,增加的子陣列為,;接著4=4,增加子陣列為,,,同理3增加的子陣列為,,,。

但這只考慮了最大元素小於等於r的情況,最大元素還要滿足大於等於l。因為最大元素滿足<=r一定包含最大元素

for(

int i=

0;i)return numr-numl;}}

;通俗講,每個籃子只攜帶一種型別的水果,兩個籃子,也就是子陣列中只有兩種元素,能收集到的水果樹的最大總量,也就是,最長子陣列。

還是尋找最長連續子陣列的問題,不過是加上了只能有兩種元素的限定條件。用雜湊表來儲存當前子陣列中的元素數,結果為雜湊表的尺寸為2時的最大元素數。

滑動視窗的思想是右指標先遞增,也就是增大滑動視窗長度,直到不滿足雜湊表尺寸為2,在這之前得到的是左指標固定在0位置時的最長子陣列,這就是當前右指標之前的最長子陣列;接著遞增左指標,即縮小滑動視窗長度直到再次滿足條件,這是當前右指標的最長子陣列,繼續迴圈直到遍歷完陣列。

class solution 

res=

max(res,r-l+1)

;}return res;}}

;

給定陣列a和k,求的是正好有k種整數的子陣列。

與795題類似,求出當子陣列中的元素種類小於等於k時子陣列數,再求出當子陣列中的元素種類小於等於k-1時子陣列數,即為所求。

class solution 

res+

=r-l+1;

}return res;

}int

subarrayswithkdistinct

(vector<

int>

& a,

int k)

};

滑動窗 鹹魚魔法記

鹹魚魔法記 time limit 1s memory limit 128mbyte submissions 478solved 171 description 給你乙個01串,我們定義這個串的鹹魚值,是最長的全1串。現在你最多可以使用k次鹹魚魔法,每次魔法,你可以使得乙個位置翻轉 0變成1,1變成0...

滑動窗空 單調佇列

給定乙個大小為n 106的陣列。有乙個大小為k的滑動視窗,它從陣列的最左邊移動到最右邊。您只能在視窗中看到k個數字。每次滑動視窗向右移動乙個位置。以下是乙個例子 該陣列為 1 3 1 3 5 3 6 7 k為3。您的任務是確定滑動視窗位於每個位置時,視窗中的最大值和最小值。輸入格式 輸入包含兩行。第...

F Fake Maxpooling(二維滑動視窗)

題目鏈結 給你乙個n m的矩陣,矩陣中每個元素的值都等於行和列的最小公倍數lcm i,j 在給你乙個k,表示k k的矩陣,這個矩陣從左到右從上到下掃瞄,每掃一次就加矩陣中的最大值,問最大值是多少?如果直接暴力的話是會tle的,所以要用到二維滑動視窗降低時間複雜度,具體的是參考了bzoj1047 參考...