有點難度,幾道和 滑動視窗 有關的演算法面試題

2022-05-17 16:10:47 字數 4005 閱讀 3450

滑動問題包含乙個滑動視窗,它是乙個執行在乙個大陣列上的子列表,該陣列是乙個底層元素集合。

假設有陣列 [a b c d e f g h ],乙個大小為 3 的滑動視窗在其上滑動,則有:

[a b c]

[b c d]

[c d e]

[d e f]

[e f g]

[f g h]

一般情況下就是使用這個視窗在陣列的合法區間內進行滑動,同時動態地記錄一些有用的資料,很多情況下,能夠極大地提高演算法地效率。

給定乙個陣列 nums,有乙個大小為 k 的滑動視窗從陣列的最左側移動到陣列的最右側。你只可以看到在滑動視窗 k 內的數字。滑動視窗每次只向右移動一位。

返回滑動視窗最大值。

示例:

輸入: nums = [1,3,-1,-3,5,3,6,7], 和 k = 3

輸出: [3,3,5,5,6,7]

解釋:

滑動視窗的位置 最大值

--------------- -----

[1 3 -1] -3 5 3 6 7 3

1 [3 -1 -3] 5 3 6 7 3

1 3 [-1 -3 5] 3 6 7 5

1 3 -1 [-3 5 3] 6 7 5

1 3 -1 -3 [5 3 6] 7 6

1 3 -1 -3 5 [3 6 7] 7

利用乙個雙端佇列,在佇列中儲存元素在陣列中的位置, 並且維持佇列的嚴格遞減,,也就說維持隊首元素是 **最大的 **,當遍歷到乙個新元素時, 如果佇列裡有比當前元素小的,就將其移除佇列,以保證佇列的遞減。當佇列元素位置之差大於 k,就將隊首元素移除。

deque 的含義是 「double ended queue」,即雙端佇列,它具有佇列和棧的性質的資料結構。顧名思義,它是一種前端與後端都支援插入和刪除操作的佇列。

deque 繼承自 queue(佇列),它的直接實現有 arraydeque、linkedlist 等。

//在頭部移除元素

if (deque.getfirst() == i - k)

//輸出結果

if (i >= k - 1)

}return res;}}

給定乙個字串,請你找出其中不含有重複字元的最長子串的長度。

示例 1:

輸入: "abcabcbb"

輸出: 3

解釋: 因為無重複字元的最長子串是 "abc",所以其長度為 3。

建立乙個256位大小的整型陣列 freg ,用來建立字元和其出現位置之間的對映。

維護乙個滑動視窗,視窗內的都是沒有重複的字元,去盡可能的擴大視窗的大小,視窗不停的向右滑動。

// 滑動視窗

// 時間複雜度: o(len(s))

// 空間複雜度: o(len(charset))

class solution ;

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

int res = 0;

// 整個迴圈從 l == 0; r == -1 這個空視窗開始

// 到l == s.size(); r == s.size()-1 這個空視窗截止

// 在每次迴圈裡逐漸改變視窗, 維護freq, 並記錄當前視窗中是否找到了乙個新的最優值

while(l < s.size())else

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

}return res;}};

給定乙個整數陣列和乙個整數 k,判斷陣列中是否存在兩個不同的索引 i 和 j,使得nums [i] = nums [j],並且 i 和 j 的差的絕對值最大為 k。

示例 1:

輸入: nums = [1,2,3,1], k = 3

輸出: true

示例 2:

輸入: nums = [1,0,1,1], k = 1

輸出: true

示例 3:

輸入: nums = [1,2,3,1,2,3], k = 2

輸出: false

使用用滑動視窗與查詢表來解決。

// 時間複雜度: o(n)

// 空間複雜度: o(k)

class solution

record.insert(nums[i]);

// 保持record中最多有k個元素

// 因為在下一次迴圈中會新增乙個新元素,使得總共考慮k+1個元素

if(record.size() == k + 1)

}return false;}};

給定乙個含有n個正整數的陣列和乙個正整數s ,找出該陣列中滿足其和≥ s的長度最小的連續子陣列如果不存在符合條件的連續子陣列,返回 0。

示例:

輸入: s = 7, nums = [2,3,1,2,4,3]

輸出: 2

解釋: 子陣列 [4,3] 是該條件下的長度最小的連續子陣列。

定義兩個指標 left 和 right ,分別記錄子陣列的左右的邊界位置。

設定滑動視窗的長度為 0 ,位於數軸的最左端。

1 .滑動視窗右端 r 開始移動,直到區間滿足給定的條件,也就是和大於 7 ,此時停止於第三個元素 2,當前的最優長度為 4

2. 滑動視窗左端 l 開始移動,縮小滑動視窗的大小,停止於第乙個元素 3,此時區間和為 6,使得區間和不滿足給定的條件(此時不大於 7)

3. 滑動視窗右端 r 繼續移動,停止於第四個元素 4,此時和位 10 ,但最優長度仍然為 4

// 滑動視窗的思路

// 時間複雜度: o(n)

// 空間複雜度: o(1)

class solution

if(sum >= s)

}if(result==nums.length+1)

return result;}}

如果你覺得這篇內容對你挺有啟發,我想邀請你幫我三個忙:

TCP的固定視窗和滑動視窗

tcp 提供了流量控制機制。流量控制可以調整給定會話中源和目的之間的資料流速,有助於保持 tcp 傳輸的可靠性。tcp 還提供了流量控制機制。流量控制可以調整給定會話中源和目的之間的資料流速,有助於保持 tcp 傳輸的可靠性。流量控制的實施方法包括限制一次可以 的資料段數量,並要求在傳送更多資料段之...

604 滑動視窗內數的和

604.滑動視窗內數的和 給你乙個大小為n的整型陣列和乙個大小為k的滑動視窗,將滑動視窗從頭移到尾,輸出從開始到結束每乙個時刻滑動視窗內的數的和。您在真實的面試中是否遇到過這個題?yes 樣例對於陣列 1,2,7,8,5 滑動視窗大小k 3。1 2 7 10 2 7 8 17 7 8 5 20 返回...

幾道和 堆疊 佇列 有關的面試演算法題

問題描述 給定乙個只包括 的字串,判斷字串是否有效。解題思路 這道題讓我們驗證輸入的字串是否為括號字串,包括大括號,中括號和小括號。這裡我們使用棧。動畫演示 20.valid parentheses 實現 class solution else if issym stack.peek achar e...