目錄
暴力題解
優化:滑動窗口+維護大小值
暴力題解
class Solution:def findIndices(self, nums: List[int], indexDifference: int, valueDifference: int) -> List[int]:n=len(nums)for i in range(n):for j in range(n-1,-1,-1):if abs(i-j)>=indexDifference and abs(nums[i]-nums[j])>=valueDifference:return [i,j]return [-1,-1]
優化:滑動窗口+維護大小值
簡單來說,i和j是滑動窗口的兩邊,根據不等式1,我們可以建立i和j之間的關系(如果數組排序后,我們可以建立值與值作為滑動窗口的兩邊,但此題不能排序),?
?接著,我們需要滑動,可以從左到右也可以從右到左滑動
接著是最核心的部分,因為我們需要比較值的大小,所以我們需要比較滑動窗口兩邊的大小關系,并返回下標,根據不等式1,我們可以推想,如果滑動窗口向右滑動的話,i在左邊,j在右邊,我們比較的應該是j和(i左邊的一大段),所以,我們可以記錄i左邊的max和min值,當滑動的過程中,出現min-nums[j]或者max-nums[j]的關系符合不等式2的時候,就可以返回下標[min,j]或者[max,j]
代碼如下(我這里用的是從右到左):
相應的就是比較i和(j右邊的一大段),倒著遍歷即可。
class Solution:def findIndices(self, nums: List[int], indexDifference: int, valueDifference: int) -> List[int]:n=len(nums)if n>indexDifference:mn=n-1mx=n-1#i左,j右for j in range(n-1,-1,-1):i=j-indexDifferenceif nums[j]>nums[mx]:mx=jif nums[j]<nums[mn]:mn=jif abs(nums[mx]-nums[i])>=valueDifference:return [mx,i] if abs(nums[i]-nums[mn])>=valueDifference:return [mn,i]if i==0:return [-1,-1] return [-1,-1]