📌  相关文章
📜  国际空间研究组织 | ISRO CS 2017 – 5 月 |问题 11(1)

📅  最后修改于: 2023-12-03 15:23:04.277000             🧑  作者: Mango

国际空间研究组织 | ISRO CS 2017 – 5 月 | 问题 11

题目描述

有一个长度为 $N$ 的数组 $A$ 和一个整数 $K$。你需要找出一个最长的连续子数组 $B$ 使得 $B$ 中最大值与最小值之间的差值小于等于 $K$。

输入格式

第一行包含两个整数 $N$ 和 $K$。

第二行包含 $N$ 个整数 $A_1, A_2, \cdots, A_N$。

输出格式

输出一个整数表示答案。

样例输入
5 2
3 1 4 1 5
样例输出
3
解法思路

本题需要使用双指针来解决。

我们定义两个指针 $left$ 和 $right$,初始值都为 $0$。

我们每次移动右指针,并从左指针到右指针的位置中找到最小值 $min$ 和最大值 $max$,然后判断 $max - min$ 是否小于等于 $K$。

如果 $max - min > K$,那么我们需要将左指针向右移动,直到 $max - min \le K$。

每一次移动左指针和右指针后,都需要更新最长的连续子数组 $B$ 的长度。

参考代码
def find_longest_subarray(n: int, k: int, a: List[int]) -> int:
    left = 0
    min_val = max_val = a[0]
    ans = 1
    for right in range(1, n):
        min_val = min(min_val, a[right])
        max_val = max(max_val, a[right])
        while max_val - min_val > k:
            min_val = min(min_val, a[left])
            max_val = max(max_val, a[left])
            left += 1
        ans = max(ans, right - left + 1)
    return ans
复杂度分析

时间复杂度:$O(N)$。

空间复杂度:$O(1)$。