知识点

双指针

思路

维护双指针,右指针每次向右移动一次,表示当前的末尾位置,左指针移动到满足最大元素和最小元素的差值小于等于k的最左位置,更新答案。

维护最大最小值可以用multiset或者map实现。

时间复杂度是 O(nlogn)

AC Code(C++)

class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param heights int整型vector 
     * @param k int整型 
     * @return int整型
     */
    int findMaxRangeWithinThreshold(vector<int>& heights, int k) {
        int res = 0;
        multiset<int> S;
        for (int i = 0, j = 0; i < heights.size(); i ++) {
            S.insert(heights[i]);
            while (S.size() and *S.rbegin() - *S.begin() > k) {
                S.erase(S.find(heights[j ++]));
            }
            res = max(res, i - j + 1);
        }
        return res;
    }
};