考察的知识点:双指针;

解答方法分析:

  1. 初始化变量 ans 为 0,用于记录最大的连续子数组范围大小。
  2. 定义两个指针 i 和 j,初始值都为 0,用于标记当前连续子数组的起始位置。
  3. 初始化变量 maxElement 和 minElement,分别用于记录当前连续子数组中的最大值和最小值,初始值均为 heights[0]。
  4. 进入循环,循环条件是 i 小于 heights 的长度且 j 小于 heights 的长度。这是因为 j 表示连续子数组的结束位置,当 j 超过了列表的长度时,意味着已经遍历完整个列表。
  5. 在循环中,首先更新 maxElement 和 minElement,将 heights[i] 和 heights[j] 与当前的最大值和最小值进行比较并更新。
  6. 计算当前连续子数组的最大值和最小值之差,并将其保存在变量 temp 中。
  7. 如果 temp 大于等于 0 并且小于等于 k,说明当前连续子数组满足要求,计算连续子数组的范围(j - i + 1),并将其与 ans 进行比较并更新最大值。
  8. 将 j 指针向后移动一位。
  9. 如果 temp 不满足要求,即大于 k,则说明当前连续子数组不满足要求,需要重新寻找下一个符合要求的子数组。将 i 和 j 设置为下一个子数组的起始位置,并更新 maxElement 和 minElement 为新的起始位置上的元素。
  10. 循环结束后,返回 ans,即最大的连续子数组范围大小。

所用编程语言:C++;

完整编程代码:↓

class Solution {
  public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     *
     * @param heights int整型vector
     * @param k int整型
     * @return int整型
     */
    int findMaxRangeWithinThreshold(vector<int>& heights, int k) {
        int ans = 0;
        int i = 0, j = 0;
        int maxElement = heights[0], minElement = heights[0];
        while (i < heights.size() && j < heights.size()) {
            maxElement = max(maxElement, max(heights[i], heights[j]));
            minElement = min(minElement, min(heights[i], heights[j]));
            int temp = maxElement - minElement;
            if (temp >= 0 && temp <= k) {
                ans = max(ans, j - i + 1);
                j++;
            } else {
                i++;
                j = i;
                maxElement = minElement = heights[i];
            }
        }
        return ans;
    }
};