Hello world!

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};
    }
};
posted @   Eaven_Wang  阅读(7)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· winform 绘制太阳,地球,月球 运作规律
· 上周热点回顾(3.3-3.9)
点击右上角即可分享
微信分享提示