目录
暴力题解
优化:滑动窗口+维护大小值
暴力题解
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-1
mx=n-1
#i左,j右
for j in range(n-1,-1,-1):
i=j-indexDifference
if nums[j]>nums[mx]:
mx=j
if nums[j]<nums[mn]:
mn=j
if 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]