📅  最后修改于: 2023-12-03 15:23:04.277000             🧑  作者: Mango
有一个长度为 $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)$。