LeetCode 2905 找出满足差值条件的下标II 题解

示例

nums = [8, 3, 12, 5, 1, 10, 7, 13]
indexDifference = 3
valueDifference = 6

答案
[maxIdx, j] = [0, 4]

我的思路是直接枚举写,但这题是中等题,一定不会让你好过的,所以也是喜提了超时,先说一下我的做题思路吧。
其实很简单就是双指针,先初始化l=0和r=l+indexDifference,然后当r++后,同时l++,然后设置一个循环条件,当l>=0,l--,代码如下所示,短是真的短,但是没有维护,一般碰到这种类型的题目一定是需要维护的,减少复杂度,将最大值最小值记录下来的同时也不破环原有的规则

class Solution {
    public int[] findIndices(int[] nums, int indexDifference, int valueDifference) {
        int n = nums.length;
        int l=0;
        int r=0;
        for(int i=indexDifference;i<n;i++){
            l = i-indexDifference;
            while(l>=0){
                if(Math.abs(nums[i]-nums[l])>=valueDifference){
                    return new int[]{i,l};
                }
                else l--;
            }
        }
        return new int[]{-1,-1};
    }
}

然后再来看看灵神的做法与其对该代码的维护和优化

来说说灵神的思路:通过一遍遍历,当然也是双指针,但是可以通过维护最大最小值,然后优化掉我的l--,避免重复遍历,毕竟重复遍历以后,时间复杂度最坏可以到o(n*n)
还是画一个图可能比用言语去说更清晰一些。

画的还是有点难以理解,所以结合文字在看一遍

先初始化变量

maxIdx = 0
minIdx = 0

从 j = 3 开始遍历:

我们每次取 i = j - indexDifference

🔁 第 1 步:j = 3, i = 0

  • nums[i] = 8

  • maxIdx = 0, minIdx = 0(保持)

  • 检查:

    • nums[maxIdx] - nums[j] = 8 - 5 = 3 < 6

    • nums[j] - nums[minIdx] = 5 - 8 = -3 < 6 ❌ ➡️ 不满足,继续

🔁 第 2 步:j = 4, i = 1

  • nums[i] = 3

  • 比较:

    • nums[1] > nums[maxIdx]3 > 8

    • nums[1] < nums[minIdx]3 < 8 ✅ → minIdx = 1

  • 检查:

    • nums[maxIdx] - nums[4] = 8 - 1 = 7 ✅ → 满足!

返回结果

[maxIdx, j] = [0, 4]

代码如下

class Solution {
    public int[] findIndices(int[] nums, int indexDifference, int valueDifference) {
        int maxIdx = 0;
        int minIdx = 0;
        for (int j = indexDifference; j < nums.length; j++) {
            int i = j - indexDifference;
            if (nums[i] > nums[maxIdx]) {
                maxIdx = i;
            } else if (nums[i] < nums[minIdx]) {
                minIdx = i;
            }
            if (nums[maxIdx] - nums[j] >= valueDifference) {
                return new int[]{maxIdx, j};
            }
            if (nums[j] - nums[minIdx] >= valueDifference) {
                return new int[]{minIdx, j};
            }
        }
        return new int[]{-1, -1};
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值