Longest Continuous Subarray With Absolute Diff Less Than or Equal to Limit
Link
Description
Given an array of integers nums and an integer limit, return the size of the longest non-empty subarray such that the absolute difference between any two elements of this subarray is less than or equal to limit.
Example 1:
- Input:
nums = [8,2,4,7], limit = 4
- Output:
2
- Explanation:
| All subarrays are:
[8] with maximum absolute diff |8-8| = 0 <= 4.
[8,2] with maximum absolute diff |8-2| = 6 > 4.
[8,2,4] with maximum absolute diff |8-2| = 6 > 4.
[8,2,4,7] with maximum absolute diff |8-2| = 6 > 4.
[2] with maximum absolute diff |2-2| = 0 <= 4.
[2,4] with maximum absolute diff |2-4| = 2 <= 4.
[2,4,7] with maximum absolute diff |2-7| = 5 > 4.
[4] with maximum absolute diff |4-4| = 0 <= 4.
[4,7] with maximum absolute diff |4-7| = 3 <= 4.
[7] with maximum absolute diff |7-7| = 0 <= 4.
Therefore, the size of the longest subarray is 2.
|
Example 2:
- Input:
nums = [10,1,2,4,7,2], limit = 5
- Output:
4
- Explanation:
The subarray [2,4,7,2] is the longest since the maximum absolute diff is |2-7| = 5 <= 5.
Example 3:
- Input:
nums = [4,2,2,2,4,4,2,2], limit = 0
- Output:
3
Constraints:
1 <= nums.length <= 10^5
1 <= nums[i] <= 10^9
0 <= limit <= 10^9
Solution
Way 1
| class Solution {
public:
int longestSubarray(vector<int>& nums, int limit) {
multiset<int> window;
int res = 0;
for (int left = 0, right = 0; right < nums.size(); right++) {
window.insert(nums[right]);
while (*window.rbegin() - *window.begin() > limit) {
window.erase(window.find(nums[left]));
left++;
}
res = max(res, right - left + 1);
}
return res;
}
};
|
- Time complexity: \(O(n \log n)\);
- Space complexity: \(O(n)\).
Way 2
| class Solution {
public:
int longestSubarray(vector<int>& nums, int limit) {
deque<int> maxQueue, minQueue;
int res = 0;
for (int left = 0, right = 0; right < nums.size(); right++) {
while (!maxQueue.empty() && nums[maxQueue.back()] < nums[right]) {
maxQueue.pop_back();
}
while (!minQueue.empty() && nums[minQueue.back()] > nums[right]) {
minQueue.pop_back();
}
maxQueue.push_back(right);
minQueue.push_back(right);
while (!maxQueue.empty() && !minQueue.empty()
&& nums[maxQueue.front()] - nums[minQueue.front()] > limit) {
if (nums[left] == nums[maxQueue.front()]) {
maxQueue.pop_front();
} else if (nums[left] == nums[minQueue.front()]) {
minQueue.pop_front();
}
left++;
}
res = max(res, right - left + 1);
}
return res;
}
};
|
- Time complexity: \(O(n)\);
- Space complexity: \(O(n)\).
Another way of writing:
| class Solution {
public:
int longestSubarray(vector<int>& nums, int limit) {
deque<int> maxQueue, minQueue;
int res = 0;
for (int left = 0, right = 0; right < nums.size(); right++) {
while (!maxQueue.empty() && nums[maxQueue.back()] <= nums[right]) {
maxQueue.pop_back();
}
while (!minQueue.empty() && nums[minQueue.back()] >= nums[right]) {
minQueue.pop_back();
}
maxQueue.push_back(right);
minQueue.push_back(right);
while (!maxQueue.empty() && !minQueue.empty()
&& nums[maxQueue.front()] - nums[minQueue.front()] > limit) {
left++;
if (maxQueue.front() < left) {
maxQueue.pop_front();
}
if (minQueue.front() < left) {
minQueue.pop_front();
}
}
res = max(res, right - left + 1);
}
return res;
}
};
|