玩轉演算法 滑動視窗

2021-08-06 04:41:07 字數 2917 閱讀 8415

209.minimum size subarray sum

給定乙個整型陣列和乙個數字s,找到陣列中最短的乙個連續子陣列使得連續子陣列的數字和sum >= s,返回這個最短的連續子陣列的返回值。

·如,給定陣列[2,3,1,2,4,3],s = 7

·答案為[4,3],返回2

暴力解:遍歷所有的連續子陣列[i,j]

計算其和sum,驗證sum=s;

時間複雜度o(n^3)

什麼方法時間複雜度可以優化為o(n^2)

#include #include #include using namespace std;

class solution

else

if(sum >= s)

}if(res == nums.size() + 1)

return res;

}};int main();

vectorvec(arr,arr+sizeof(arr)/sizeof(int));

int ret = solution().minsubarraylen(12,vec);

cout << ret << endl;

return 0;

}

3.longest substring  without repeating characters

在乙個字串中尋找沒有重複字母的最長字串

·如「abcabcbb」,則結果為「abc」

·如「bbbb」則結果為』b』

·如「pwwkew」,則結果為「wrk」

#include #include #include #include using namespace std;

class solution;

int l = 0;

int r = -1; //滑動視窗為s[l...r]

int res;

while(l < s.size())

else

res = max(res, r-l+1);

}return res;

}};int main()

438.find all anagrams in a string

給定乙個字串s和乙個非空字串p,找出p中的所有是s的anagrams字串的子串,返回這些子串的起始索引。

·如s = 「cbaebabacd」p = 「abc」 返回[0,6]

·如s=」abab」,p = 「ba」,返回[0,1,2]

--字符集範圍?英文小寫字母

--返回的解的順序?任意

#include #include #include #include using namespace std;

class solution

if(sv == pv) res.push_back(0);

for(int i = target.size(); i < nums.size();i++)

return res;

}};int main()

cout << endl;

return 0;

}

76.minimum window substring

給定乙個字串s和t,在s中尋找最短的子串,包含t中的所有的字元

·如s=」adobecodebanc」; t = 「abc」

·結果為「banc」

--字元範圍?

--若沒有解?返回「」

--若有多個解?  保證只有乙個解

--什麼叫包含所有字元?s=」a」,t = 「a」;

#include #include #include #include using namespace std;

class solution

for(int end = 0; end < src.size(); end++)

sv[src[end]]++;

if(lack == 0)

if(answer > end - begin + 1)

while(lack == 0)}}

return lp == -1 ?" ": src.substr(lp,rp-lp+1);

}};int main()

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

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

演算法 滑動視窗

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

演算法 滑動視窗

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