思路一:滑动窗口+有序集合 O(nlogn)
具体思路:multiset维护滑动窗口内的值。
class Solution {
public:
int longestSubarray(vector<int>& nums, int limit) {
int n = nums.size(), l = 0, ans = 0;
multiset<int> st;
for (int r = 0; r < n; ++r) {
st.insert(nums[r]);
while (abs(*st.begin() - *st.rbegin()) > limit) {
st.erase(st.find(nums[l]));
l++;
}
ans = max(ans, r - l + 1);
}
return ans;
}
};
思路二优化:滑动窗口+单调队列 O(n)
维护两个单调队列:单调递增+单调递减,将查找的复杂度降到O(1),但是代码不太好写。