题目
https://leetcode-cn.com/problems/longest-continuous-subarray-with-absolute-diff-less-than-or-equal-to-limit/
滑动窗口
使用双指针维护窗口移动,使用TreeMap或者双端队列来维护窗口中得最大值和最小值
TreeMap
class Solution {
public int longestSubarray(int[] nums, int limit) {
int n = nums.length;
int left = 0;
int right;
int ans = 0;
TreeMap<Integer, Integer> map = new TreeMap<>();
for (right = 0; right < n; right++) {
map.put(nums[right], map.getOrDefault(nums[right], 0) + 1);
while (map.lastEntry().getKey() - map.firstEntry().getKey() > limit) {
map.put(nums[left], map.get(nums[left]) - 1);
if (map.get(nums[left]) == 0)
map.remove(nums[left]);
left++;
}
ans = Math.max(ans, right - left + 1);
}
return ans;
}
}
双端队列
class Solution {
public int longestSubarray(int[] nums, int limit) {
int n = nums.length;
int left = 0, right, ans = 0;
Deque<Integer> maxd = new ArrayDeque<>();
Deque<Integer> mind = new ArrayDeque<>();
for (right = 0; right < n; right++) {
while (!maxd.isEmpty() && nums[right] > maxd.peekLast()) maxd.pollLast();
while (!mind.isEmpty() && nums[right] < mind.peekLast()) mind.pollLast();
maxd.offer(nums[right]);
mind.offer(nums[right]);
while (maxd.peek() - mind.peek() > limit) {
if (maxd.peek() == nums[left]) maxd.poll();
if (mind.peek() == nums[left]) mind.poll();
left++;
}
ans = Math.max(ans, right - left + 1);
}
return ans;
}
}