怎麼改變視窗大小 談一談「滑動視窗」

2021-10-12 18:06:41 字數 3208 閱讀 2896

什麼是滑動視窗?為什麼要講滑動視窗?

kmp演算法是應用了滑動視窗最典型的例子,但此片文章不以kmp演算法來做講解例子,因為這個演算法裡面已經容納了很多前人的處理與思想,難懂的同時可能自帶勸退屬性。陣列是一種基本的資料結構,會寫**的人不會陣列操作都不敢出門見人,但是很多基於資料的操作會浪費大量的時間,滑動視窗就是為了幫助我們提公升效率的一種演算法。

我們就從lintcode上找乙個最簡單直白的滑動視窗演算法來進行距離,究竟該怎麼分析滑動視窗演算法,後面還會附上幾道高階滑窗,有興趣的同學可以看一下:

什麼時候使用滑動視窗演算法?

之所以說這道題簡單,是因為他剛上來就告訴你了,這個要使用滑動視窗。那麼什麼情況下使用滑窗呢?首先滑窗是為了解決效率問題的,也就是說,滑窗可以解決的問題,一般陣列都可以解決,所以當我們開始解決乙個問題的時候,涉及到多維陣列操作(簡單來說就是時間複雜度為

所以該演算法的時間複雜度為

,那麼如何減少時間複雜度呢?我們通用的想法就是剪枝優化,這裡我們發現其實沒必要每次都比較,當視窗滑動的時候,我們完全可以利用之前視窗的結果(

利用之前計算的結果輔助下次計算是很好的程式設計思路,動態規劃也有使用)來計算這次的結果。但是請各位注意,滑窗演算法也有他的侷限性,當陣列資料具有某種規律時,滑窗演算法不一定優於傳統演算法。

滑窗演算法的一般步驟

這裡我總結了幾個滑窗演算法,找了乙個解決滑窗演算法的一般套路:

1、選擇初始視窗

這一步一般不難,滑窗演算法一般都有個start和end,我們只要確定自己的start和end就好了,這個問題已經給出了,start肯定就是0,end肯定就是0+k。

比較難一些的滑窗演算法,視窗大小是會改變的,kmp的滑窗為字串長度。

2、確認滑動策略

這一步就是讓我們確認什麼時候要開始改變滑窗的狀態,對於這個問題,我們知道滑窗狀態有:1、最大值的index;2、初始位置;3、終止位置。對於我們這道題來講,滑窗狀態改變是很直白的:

1、當滑窗右邊出現乙個值比當前最大值還大時,改變最大值index

2、當滑窗左邊大於最大值index時,改變最大值index

3、每一次滑動改變視窗位置

對於kmp也有類似的策略:

當匹配失敗時,將視窗向後移動n個位數,使得視窗的第i個位置與母串對齊,此時,i前面的字串應該與之前匹配的一致(這之後就要引用公共前字尾的概念了,所以很多老師上來就講前字尾會讓初學者一臉懵逼)

3、確認輸出策略我們解決任何問題的時候,都不要忘了自己當時是為了解決什麼問題。搞複雜演算法搞著搞著我們會懵掉大多數原因是忘了初心,只為了用演算法而用演算法,這和很多公司是一樣的,為了加班而加班,為了用新技術而用新技術,為了狼性而狼性。對於這道題,我們是要輸出最大值,而彈窗又是每次迴圈都會移動的,所以我們每次移動輸出一次當前largeindex的值

第一步:

第二步:

第三步:此時發現新增的大於之前的,改變largeindex

具體**如下:

public listmaxslidingwindow(int nums, int k) ; 

int start = 0;

int end = k-1;

int largeindex = 0;

//不夠乙個視窗

if(nums.length < k || nums.length == 0)

//尋找第乙個視窗最大值,初始化

for(int i = 0; i < k ; i++)

}//開始滑動,以視窗右側為主視角

for(int i = end; i< nums.length;i++)

if(start > largeindex)}}

ans.add(nums[largeindex]);

start++;

end++;

}return ans;

}

對於kmp演算法,當視窗內所有字元都匹配成功時,輸出
到這裡就結束了,除了此題,和kmp演算法,再給各位提供一道題進行練手吧:

問題描述:給定乙個01陣列arr和 乙個整數k, 統計有多少區間符合如下條件:

1、區間的兩個端點都為 0 (允許區間長度為1)

2、區間內 1 的個數不多於k樣例

樣例 1:

輸入: arr = [0, 0, 1, 0, 1, 1, 0], k = 1 輸出: 7 解釋: [0, 0], [1, 1], [3, 3], [6, 6], [0, 1], [0, 3], [1, 3] (區間 [i,j] 表示下標 i(包括)和下標 j(包括)之間的元素)

樣例 2:

輸入: arr = [1, 1, 1, 0, 0, 1], k = 2 輸出: 3 解釋: [3, 3], [4, 4], [3, 4] (區間 [i,j] 表示下標 i(包括)和下標 j(包括)之間的元素)注意事項arr的大小不超過10^5

寫在最後:演算法題目本身可能除了筆試面試,不會為我們帶來什麼好處。但是演算法的思路會經常用在我們的工程專案中或者日常生活中,演算法給我們帶來的邏輯思維能力也是我們貧瘠生活裡的補品。最後祝各位武運昌隆,祝祖國繁榮昌盛,祝疫情早點過去~

怎麼改變視窗大小 Win32 限制子視窗的最小尺寸

lresult callback wndproc hwnd hwnd,uint message 視窗訊息 wparam wparam,lparam lparam 視窗建立時的訊息順序 define wm nccreate 0x0081 define wm nccalcsize 0x0083 defi...

word怎麼改變字型大小

我們先用滑鼠左鍵選中需要改變大小的內容,比如此處我們選擇 經驗 然後在word的工具欄找到如圖所示的字型大小選擇部分。點選其右側的向下的小三角後,會出現乙個字型大小的列表,我們找到我們想要的字型大小。比如這裡我們選擇了 初號 當您的滑鼠放到 初號 上的時候,雖然您還沒有點選選中,不過您剛才選擇的那部...

Vim改變視窗大小

改變視窗大小 window resize ctrl w ctrl w 使得所有視窗 幾乎 等寬 等高,但當前視窗使用 winheight 和 winwidth res ize n res resize ctrl w ctrl w 使得當前視窗高度減 n 預設值是 1 如果在 vertical 之後使...