在解leetcode題的時候,遇到了幾個新的演算法思想,這個系列文章就把leetcode中的一些演算法思想做一些整理,包括老生常談的動態規劃,也包括我最新接觸的滑動視窗思想,並查集等,另外,遇到新的題目的時候也會在這裡做一些整理。
起源-計算機網路協議
在介紹滑動視窗思想之前,首先介紹這個演算法思想的由來,是一種tcp網路協議-滑動視窗協議,其實在大學學計算機網路的時候,自己可能並沒有對這個協議有太多的印象,也許是當時用的太少,工作之後這方面涉及的也比較少,所以在整理這篇文章之前,我先補了一下計算機網路知識-滑動視窗協議。
一條tcp連線的雙方主機都為該連線設定了接收快取。當該tcp連線收到正確按序位元組後,它就把資料放入快取中,應用程序從快取中讀取資料,是非同步的,因此不保證所有資料都在第一時間被讀取,當傳送方傳送的資料過多或者過快的時候,就會造成快取不夠用,也就是快取溢位。
tcp通過讓傳送方維護乙個接收視窗的變數來提供流量控**務,以消除快取溢位的可能性,接收視窗用於告訴傳送方接收方還有多少空間,做乙個比喻,也就是說,傳送資訊方相當於做餅的人,接收方相當於吃餅的人,接收方通過乙個變數告訴傳送方,我還能吃多少餅,顯然這個變數是可以變化的。
(以上部分內容出自《計算機網路-自頂向下方法》 ((美) james f kurose,(美)keith w ross)著)
滑動視窗思想(演算法)
比起滑動視窗演算法這種比較正式的演算法叫法,我更願意把它稱作一種思想,因為他並不是像並查集,紅黑樹那樣使用固定的資料結構去解決問題的演算法,它更像動態規劃那種,是一種思想,或者可以稱為解決問題的思路,在我遇到的例子當中,並沒有哪乙個題目是必須用這個演算法來解決的,它是一種優化的思想,用於解決乙個特定大小的字串或陣列上進行操作,用於降低迴圈的巢狀層次,也就是降低演算法複雜度。總結一下就是「請找到滿足xx的最x的區間(子串、子陣列)的xx」這類問題都可以用滑動視窗思想來優化。
具體例項
a的最大長度是20000,因此,不能使用列舉方案了,我們考慮用滑動視窗來解決
class solution
}else
}return ans;}};
視窗的起點從i-1開始,每次先和相鄰的點做比較,如果不相等,視窗進一步向後滑動,如果繼續不等,判斷是否和下乙個flag相等,視窗繼續滑動,直到不滿足條件為止。 滑動視窗的思想
求乙個字串不重複的子串的最大的長度 例如 abcabcbb,the answer is abc which the length is 3.滑動視窗是處理字串和陣列的經典方法,時間複雜度o n 滑動視窗的思想 滑動視窗在字串上從左到右滑動,一直到字串的尾部,滑動視窗的長度是動態變化的,需要兩個指標指...
滑動視窗演算法 演算法 滑動視窗 二
演算法 這算是滑動視窗的另外乙個典型題目,在資料量比較少的時候,可以直接採用暴力法解決 不過資料量比較大的時候,我們就需要想辦法解決視窗裡面最大值的思路,這裡我們採用雙端佇列queue來實現,借助 queue來儲存前面計算過的最大值資訊。題目 解法1 暴力解法 按照 視窗大小,從頭到尾依次遍歷,將每...
AC演算法思想
多模式匹配ac演算法的核心仍然是尋找模式串內部規律,達到在每次失配時的高效跳轉。這一點與單模式匹配kmp演算法和bm演算法是一致的。不同的是,ac演算法尋找的是模式串之間的相同字首關係。ac演算法的核心是三張查詢表 goto failure和output,共包含四種具體的演算法,分別是計算三張查詢表...