ETH官方钱包

前往
大廳
主題

LeetCode - 1438. Longest Continuous Subarray With Absolute Diff Less Than or Equal to Limit 解題心得

Not In My Back Yard | 2024-08-03 12:00:27 | 巴幣 0 | 人氣 48

題目連結(jié):


題目意譯:
給定一個(gè)整數(shù)陣列 nums 以及一整數(shù) limit,回傳最長(zhǎng)非空的子陣列之長(zhǎng)度,使得這個(gè)子陣列中任兩個(gè)元素的絕對(duì)差值小於等於 limit。

限制:
1 ≦ nums.length ≦ 10 ^ 5
1 ≦ nums[i] ≦ 10 ^ 9
0 ≦ limit ≦ 10 ^ 9



範(fàn)例測(cè)資:
範(fàn)例 1:
輸入: nums = [8,2,4,7], limit = 4
輸出: 2
解釋: 所有子陣列為以下:
[8],其最大絕對(duì)差值為 |8-8| = 0 ≦ 4。
[8,2],其最大絕對(duì)差值為 |8-2| = 6 > 4。
[8,2,4],其最大絕對(duì)差值為 |8-2| = 6 > 4。
[8,2,4,7],其最大絕對(duì)差值為 |8-2| = 6 > 4。
[2],其最大絕對(duì)差值為 |2-2| = 0 ≦ 4。
[2,4],其最大絕對(duì)差值為 |2-4| = 2 ≦ 4。
[2,4,7],其最大絕對(duì)差值為 |2-7| = 5 > 4。
[4],其最大絕對(duì)差值為 |4-4| = 0 ≦ 4。
[4,7],其最大絕對(duì)差值為 |4-7| = 3 ≦ 4。
[7],其最大絕對(duì)差值為 |7-7| = 0 ≦ 4。
因此最長(zhǎng)的子陣列之長(zhǎng)度為 2。

範(fàn)例 2:
輸入: nums = [10,1,2,4,7,2], limit = 5
輸出: 4
解釋: 子陣列 [2,4,7,2] 是最長(zhǎng)的,因?yàn)槠渥畲蠼^對(duì)差值為 |2-7| = 5 ≦ 5。

範(fàn)例 3:
輸入: nums = [4,2,2,2,4,4,2,2], limit = 0
輸出: 3


解題思維:
本題結(jié)合了滑動(dòng)視窗(Sliding Window,如昨天的題目)以及單調(diào)佇列(Monotonic Queue,如這題)。

一樣,我們的視窗將會(huì)從索引值 0 開(kāi)始一路問(wèn):以當(dāng)前索引值 i 作為結(jié)尾的子陣列中,滿足題目條件的子陣列長(zhǎng)度最長(zhǎng)為何者?

而在一個(gè)視窗中,我們將會(huì)用兩個(gè)雙端佇列(Deque),一個(gè)來(lái)維護(hù)非嚴(yán)格遞增性、另一個(gè)則用來(lái)維護(hù)非嚴(yán)格遞減性。而這兩個(gè)雙端佇列兩個(gè)各自將會(huì)得到視窗中的元素最大值以及最小值。

而如果此時(shí)最小值與最大值之差值有超過(guò) limit,則代表著我們需要將視窗的左端點(diǎn)往右移動(dòng)來(lái)消除若干個(gè)元素。重複這個(gè)步驟直到兩者差值小於等於 limit 為止。

此時(shí)如果左端點(diǎn)停在 L,而且現(xiàn)在右端點(diǎn)索引值為 i,則可以看到以索引值 i 作為結(jié)尾的子陣列中,滿足條件者最長(zhǎng)長(zhǎng)度將會(huì)是 i - L + 1。

因此所求為各個(gè)可能的右端點(diǎn)求出的長(zhǎng)度之最大值。




此次分享到此為止,如有任何更加簡(jiǎn)潔的想法或是有說(shuō)明不清楚之地方,也煩請(qǐng)各位大大撥冗討論。

創(chuàng)作回應(yīng)

更多創(chuàng)作