leetcode 1438. 绝对差不超过限制的最长连续子数组

111 阅读1分钟

c++

class Solution {
public:
    bool check(vector<int>& nums, int k, int limit) {
        deque<int> qmin, qmax;
        for (int i = 0; i < nums.size(); i++) {
            while (qmin.size() && nums[i] < nums[qmin.back()]) qmin.pop_back();
            while (qmax.size() && nums[i] > nums[qmax.back()]) qmax.pop_back();
            qmin.push_back(i), qmax.push_back(i);
            if (i + 1 < k) continue;
            if (i - qmin.front() == k) qmin.pop_front();
            if (i - qmax.front() == k) qmax.pop_front();
            if (abs(nums[qmax.front()] - nums[qmin.front()]) <= limit) return true;
        }
        return false;
    }

    int bs(vector<int>& nums, int l, int r, int limit) {
        if (l >= r) return l;
        int mid = (l + r + 1) >> 1;
        if (check(nums, mid, limit)) l = mid;
        else r = mid - 1;
        return bs(nums, l, r, limit);
    }
    int longestSubarray(vector<int>& nums, int limit) {
        return bs(nums, 0, nums.size(), limit);
    }
};

js

var check = function(nums, k, limit) {
    var qmin = [], qmax = [];
    for (var i = 0; i < nums.length; i++) {
        while (qmin.length && nums[i] < nums[qmin[qmin.length - 1]]) qmin.pop();
        while (qmax.length && nums[i] > nums[qmax[qmax.length - 1]]) qmax.pop();
        qmin.push(i), qmax.push(i);
        if (i + 1 < k) continue;
        if (i - qmin[0] == k) qmin.shift();
        if (i - qmax[0] == k) qmax.shift();
        if (nums[qmax[0]] - nums[qmin[0]] <= limit) return true;
    } 
    return false;
} 

var bs = function(nums, l, r, limit) {
    if (l >= r) return l;
    var mid = (l + r + 1) >> 1;
    if (check(nums, mid, limit)) l = mid;
    else r = mid - 1;
    return bs(nums, l, r, limit);
}

var longestSubarray = function(nums, limit) {
    return bs(nums, 0, nums.length, limit);
};