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};
}
};
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· winform 绘制太阳,地球,月球 运作规律
· 上周热点回顾(3.3-3.9)