目录
暴力题解
优化:滑动窗口+维护大小值
暴力题解
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]