聊聊演算法 滑動視窗

2022-07-04 23:12:13 字數 2626 閱讀 7554

有看到一句話,我深以為然:「所有演算法的終極資料結構只有兩種:陣列和鍊錶!」其他所有資料結構都是陣列或鍊錶的衍生品,

http的幀傳輸,滑動視窗限流演算法、flink中的滑動視窗等,今天,我們就來聊聊滑動視窗的演算法框架!

作者原創文章,謝絕一切**,違者必究!

idea2019.03/jdk11.0.4

難度:新手--戰士--老兵--大師

滑動視窗演算法分析與應用

/* 滑動視窗演算法框架 */

private static void minwindow(string s,string t)

// 滑動視窗左邊縮小

while ( 滑動視窗縮小條件 )}}

示例,輸入: s = "adobecodebanc", t = "abc",輸出: "banc",如果不存在則返回空串。

public class slidewindow 

private static string minwindow(string s,string t)

// 目標字串使用map儲存,如果有重複的,則數量累加

mapdictt = new hashmap<>(8);

for (int i = 0; i 

// 目標字串的長度

int required = dictt.size();

// 滑動視窗左右側位置指標

int left = 0,right = 0;

// 滑動視窗中字串統計

mapwinstrmap = new hashmap<>(16);

// 視窗內子串與目標串字元匹配的個數

int formed = 0;

// 記錄最小視窗長度,

int ans = ;

//視窗進行滑動

while (right 

while (left 

winstrmap.put(c, winstrmap.get(c) -1);

if (dictt.containskey(c) && winstrmap.get(c) 

// 進行左側縮小滑動

left ++;

}//視窗向右滑動

right ++;

}return ans[0] == -1 ? "null" : s.substring(ans[1],ans[2]+1);}}

如果滿足目標條件則停下來進行視窗左側縮小滑動,並記錄下可行解的結果;視窗再向右滑動,並繼續尋找可行解,直到右

側到達終點。 此題有改良思路,即先對搜尋字串中去掉不存在於目標字串中的字元,這樣滑動匹配次數就更少了。

給定兩個字串 s1 和 s2,寫乙個函式來判斷 s2 是否包含 s1 的排列。示例,輸入: s1 = "ab",

s2 = "eidbaooo",輸出: true,解釋: s2 包含 s1 的排列之一 ("ba").

private static boolean substring(string s,string t)

maptargetmap = new hashmap<>(8);

for (int i = 0; i 

mapwinmap = new hashmap<>(16);

int left = 0,right = 0 ;

int match = 0;

while(right 

right ++;

// 視窗左側向右滑動,判斷滿足所有字元排列的子串

while (left 

c = s.charat(left);

if (targetmap.containskey(c) && targetmap.get(c).intvalue() == winmap.get(c))

left ++;}}

return false;

}

視窗中子串長度和目標串長度一樣,因為既包含了所有字元且長度一樣的子串肯定為乙個排列,即為可行解!

/**查詢最長無重複子串*/

private static string substring(string s) 

int left = 0,right = 0;

mapwinmap = new hashmap<>(8);

int position=;

while (right 

while (winmap.get(c) > 1)

left ++;

}right ++;

}return s.substring(position[1],position[2]);

}

陣列記錄可行解,然後對比其他可行解,並只保留最優解。注意,最長無重複子串不唯一,如"abebcdee",

可行解為"ebcd"或者"bcde",故原題僅輸出長度值而只有唯一解。另外,這裡其實有個優化思路,每次視窗右

後記:總以為演算法平時用的少,工作也不是演算法崗,所以沒必要去研究,可是遭到社會的毒打後,才知道演算法是很重要的,共勉!

全文完!

滑動視窗演算法 演算法 滑動視窗 二

演算法 這算是滑動視窗的另外乙個典型題目,在資料量比較少的時候,可以直接採用暴力法解決 不過資料量比較大的時候,我們就需要想辦法解決視窗裡面最大值的思路,這裡我們採用雙端佇列queue來實現,借助 queue來儲存前面計算過的最大值資訊。題目 解法1 暴力解法 按照 視窗大小,從頭到尾依次遍歷,將每...

演算法 滑動視窗

一.滑動視窗 滑動視窗其實就是高階版的雙指標技巧,只不過它依靠了資料結構 hashmap,hashset 的幫助,使得雙指標運用起來更加的靈活,更加的方便,他主要就是來解決子字串匹配問題。他主要的思路就是這樣的固定步驟 1 我們在字串 s 中使用雙指標中的左右指標技巧,初始化 left right ...

演算法 滑動視窗

最多可以將k個值從0變成1,因此滑動視窗的限制條件 0的數量 zeros 小於k,演算法過程如下 有乙個滑動視窗 slipper 每次都會從a中讀入乙個數 當讀入的數為0時,zeros 當zeros的數量大於k時,會取出slipper首部的元素,當取值為0時zeros 總體 如下 上述演算法效率並不...