1. 解题思路
这一题我一开始思路有点想复杂了,因为这道题显然是要在index相距特定距离以上的前提下找一个绝对值相差大于给定值的数,因此,我们只需要简化问题直接找对应范围内的最大值或者最小值看它是否满足条件即可。
故而,这个问题事实上就变成了求特定范围内的最大值或者最小值,而这个问题可以直接套用Segment Tree的思路进行求解,关于Segment Tree,我之前写过一个简单的博客(经典算法:Segment Tree)进行过介绍,这里就不进行展开了。
但是,后来我们注意到,这个思路事实上有点做复杂了,因为我们需要求的这个范围事实上仅仅为某个坐标之后的最大值以及最小值,因此事实上完全可以当成一个累计数组的问题来进行求解,我们只需要遍历一下左边界(记作i
),然后考察范围i+indexDifference
右侧的最大和最小元素进行考察即可。
2. 代码实现
给出python代码实现如下:
class Solution:
def findIndices(self, nums: List[int], indexDifference: int, valueDifference: int) -> List[int]:
n = len(nums)
maxs = [(x, i) for i, x in enumerate(nums)]
mins = [(x, i) for i, x in enumerate(nums)]
for i in range(n-2, -1, -1):
maxs[i] = max(maxs[i], maxs[i+1])
mins[i] = min(mins[i], mins[i+1])
for i in range(n-indexDifference):
val, idx = maxs[i+indexDifference]
if abs(val - nums[i]) >= valueDifference:
return [i, idx]
val, idx = mins[i+indexDifference]
if abs(val - nums[i]) >= valueDifference:
return [i, idx]
return [-1, -1]
提交代码评测得到:耗时852ms,占用内存42.9MB。