演算法 滑動視窗

2021-10-22 04:13:52 字數 1695 閱讀 9579

給你兩個長度相同的字串,s 和 t。

將 s 中的第 i 個字元變到 t 中的第 i 個字元需要 |s[i] - t[i]| 的開銷(開銷可能為 0),也就是兩個字元的 ascii 碼值的差的絕對值。

用於變更字串的最大預算是 maxcost。在轉化字串時,總開銷應當小於等於該預算,這也意味著字串的轉化可能是不完全的。

如果你可以將 s 的子字串轉化為它在 t 中對應的子字串,則返回可以轉化的最大長度。

如果 s 中沒有子字串可以轉化成 t 中對應的子字串,則返回 0。

思路: 求解兩個字串相應位置的ascii值查的絕對值陣列,則本題轉換為求解某乙個陣列中和小於某一值的最長連續子陣列。

public int equalsubstring(string s, string t, int maxcost) 

maxl = math.max(maxl, end - start + 1);

end++;

}return maxl;

}

維護兩個指標start,end, end不斷向前探索,當end處於某一位置時,考慮此時start位置,區間start-end中組成的滑動視窗中資料是否符合題意,如果不符合,則移動start位置,使其符合,找到符合問題的解之後,記錄該解。然後移動end,繼續下乙個位置的探索。

給定乙個含有 n 個正整數的陣列和乙個正整數 target 。

找出該陣列中滿足其和 ≥ target 的長度最小的 連續子陣列 [numsl, numsl+1, ..., numsr-1, numsr] ,並返回其長度。如果不存在符合條件的子陣列,返回 0 。

求某一陣列中和大於某一值的最短連續子陣列

public int minsubarraylen(int target, int nums) 

end++;

}return minl == integer.max_value ? 0 : minl;

}

給定乙個由若干01組成的陣列a,我們最多可以將k個值從 0 變成 1 。返回僅包含 1 的最長(連續)子陣列的長度。

求解陣列中零的個數小於某一值的最長連續子陣列

public int longestones(int a, int k) 

maxl = math.max(maxl, end - start + 1);

end++;

}return maxl;

}

1.本質上來說,滑窗是雙指標,一根指標指向左端點,一根指標指向右端點。以右指標作為驅動,拖著左指標向前走。右指標每次只移動一步,而左指標在內部 while 迴圈中每次可能移動多步。右指標是主動前移,探索未知的新區域;左指標是被迫移動,負責尋找滿足題意的區間。

2.右指標移動可以表示擴張視窗,左指標移動表示縮小視窗。

3.如果當前元素滿足題目要求時,可以挪動右指標嘗試更優解,並且更新需要記錄的變數(元素,元素個數++等)

4.如果當前視窗內的元素不滿足條件,可以挪動左指標嘗試調整,並且更新需要記錄的變數(元素,元素個數--等)

通過以上步驟視窗就開始「滑動」起來,在滑動過程中,要記得及時更新答案。一般為求最大或最小。

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

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

演算法 滑動視窗

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

演算法 滑動視窗

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