https://leetcode.com/problems/longest-continuous-subarray-with-absolute-diff-less-than-or-equal-to-limit/
2.Idea
MaxMinQueue + 2 Pointers method
3.Source
class MaxMinQueue {
public:
MaxMinQueue() {}
bool empty() { return elements.empty(); }
int size() { return elements.size(); }
void push(int val) {
elements.push(val);
while (!maxElements.empty() && val > maxElements.back()) maxElements.pop_back();
maxElements.push_back(val);
while (!minElements.empty() && val < minElements.back()) minElements.pop_back();
minElements.push_back(val);
}
int pop() {
int val = elements.front();
elements.pop();
if (val == maxElements.front()) maxElements.pop_front();
if (val == minElements.front()) minElements.pop_front();
return val;
}
int peekMax() {
return maxElements.front();
}
int peekMin() {
return minElements.front();
}
private:
queue<int> elements;
deque<int> maxElements;
deque<int> minElements;
};
class Solution {
public:
MaxMinQueue q;
int longestSubarray(vector<int>& nums, int limit) {
int n = nums.size();
int ans = 0;
int p1 = 0;
while (p1 < n) {
q.push(nums[p1]);
while(q.size() > 0 && (q.peekMax() - q.peekMin() > limit)) {
q.pop();
}
ans = max(ans, q.size());
p1++;
}
return ans;
}
};
int main()
{
Solution obj;
vector<int> in = { 8,2,4,7 };
obj.longestSubarray(in, 4);
return 0;
}
No comments:
Post a Comment