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);
};