2903. 找出满足差值条件的下标
题目描述
给你一个下标从 0 开始、长度为 n 的整数数组 nums ,以及整数 indexDifference 和整数 valueDifference 。
你的任务是从范围 [0, n - 1] 内找出 2 个满足下述所有条件的下标 i 和 j :
abs(i - j) >= indexDifference
abs(nums[i] - nums[j]) >= valueDifference
返回整数数组 answer。如果存在满足题目要求的两个下标,则 answer = [i, j] ;否则,answer = [-1, -1] 。如果存在多组可供选择的下标对,只需要返回其中任意一组即可。
注意:i 和 j 可能 相等
思路
-
假设i在左边,j在右边,那么j - i >= 0,并且j的下标一定从indexDifference开始(否则不满足j - i > indexDifference)。
-
j从indexDifference开始遍历,找到合适的i。要满足abs(nums[i] - nums[j]) >= valueDifference,nums[i]要足够大或者足够小.所以每次循环都保持i = j - indexDifference,并且记录minIdx和maxIdx,由于minIdx和maxIdx一定满足小于等于i,所以也一定满足j - minIdx >= indexDifference或者j - maxIdx >= indexDifference。
-
分别判断nums[j] - nums[minIdx]和nums[maxIdx] - nums[j]是否>=valueDifference,满足就可以返回。
代码
class Solution {
public:
vector<int> findIndices(vector<int>& nums, int indexDifference, int valueDifference) {
vector<int> result;
int len = nums.size();
int minIdx = 0,maxIdx = 0;
for(int j = indexDifference;j < len;j++){
int i = j - indexDifference;
if(nums[i] > nums[maxIdx]){
maxIdx = i;
}else if(nums[i] < nums[minIdx]){
minIdx = i;
}
if(nums[j] - nums[minIdx] >= valueDifference){
return {minIdx,j};
}
if(nums[maxIdx] - nums[j] >= valueDifference){
return {maxIdx,j};
}
}
return {-1,-1};
}
};

浙公网安备 33010602011771号