返回

难点在于理解题意:LeetCode 1438 绝对差值不超过 t 的最长连续子数组

闲谈

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

思路:

我们可以使用双指针法来解决这个问题。

  1. 将第一个指针指向子数组的开头,第二个指针指向子数组的结尾。
  2. 如果子数组中的所有元素的绝对差都小于等于 t,则将子数组的长度加 1。
  3. 否则,将第一个指针向右移动一位,并重复步骤 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),因为我们没有使用任何额外的空间。