返回
难点在于理解题意:LeetCode 1438 绝对差值不超过 t 的最长连续子数组
闲谈
2023-12-24 21:04:40
LeetCode 1438 绝对差值不超过 t 的最长连续子数组
题目链接: https://leetcode.com/problems/longest-continuous-subarray-with-absolute-diff-less-t
题目难度: 中等
题目
给定一个整数数组 nums 和一个整数 t,请找出满足以下条件的最长连续子数组的长度:
- 该子数组中任意两个元素之间的绝对差必须小于等于 t。
例如:
-
nums = [1,5,2,4,3],t = 1
- 最长连续子数组是 [2,4,3],长度为 3。
-
nums = [8,2,4,7],t = 4
- 最长连续子数组是 [8],长度为 1。
-
nums = [10,1,2,4,7,2],t = 5
- 最长连续子数组是 [7,2],长度为 2。
要求:
- 返回最长连续子数组的长度。
示例:
输入:nums = [1,5,2,4,3], t = 1
输出:3
思路:
我们可以使用双指针法来解决这个问题。
- 将第一个指针指向子数组的开头,第二个指针指向子数组的结尾。
- 如果子数组中的所有元素的绝对差都小于等于 t,则将子数组的长度加 1。
- 否则,将第一个指针向右移动一位,并重复步骤 2。
使用这种方法,我们可以在 O(n) 的时间内找到最长连续子数组的长度。
以下是 C++ 代码的实现:
class Solution {
public:
int longestSubarray(vector<int>& nums, int t) {
int left = 0, right = 0;
int maxLen = 0;
int minVal = INT_MAX, maxVal = INT_MIN;
while (right < nums.size()) {
minVal = min(minVal, nums[right]);
maxVal = max(maxVal, nums[right]);
if (maxVal - minVal <= t) {
maxLen = max(maxLen, right - left + 1);
right++;
} else {
left++;
right = left;
minVal = INT_MAX;
maxVal = INT_MIN;
}
}
return maxLen;
}
};
时间复杂度:
该算法的时间复杂度为 O(n),其中 n 是数组 nums 的长度。
空间复杂度:
该算法的空间复杂度为 O(1),因为我们没有使用任何额外的空间。