题目
解题思路
基本思路来自:我写了首诗,把滑动窗口算法算法变成了默写题,具体判断方法与官解类似。
- 对窗口内(
[left,right)
)元素分别建立一个最小单调队列和最大单调队列储存窗口索引; - 每次循环先将
right
右移一位,后将窗口最右端元素right-1
入队,如果队头元素在窗口外,则将队头元素出队; - 如果窗口内最值的差距不满足要求,则
left
右移一位,因此窗口([left,right)
)不一定时时满足要求,但right-left
必为最终答案。
代码
public class Solution {
public int LongestSubarray(int[] nums, int limit) {
int left=0,right=0,n=nums.Length;
var max=new LinkedList<int>();
var min=new LinkedList<int>();
while(right<n){
right++;
while(max.Count>0&&nums[max.Last()]<=nums[right-1]) max.RemoveLast();
while(min.Count>0&&nums[min.Last()]>=nums[right-1]) min.RemoveLast();
max.AddLast(right-1);
min.AddLast(right-1);
if(max.First()<left)max.RemoveFirst();
if(min.First()<left)min.RemoveFirst();
if(nums[max.First()]-nums[min.First()]>limit) left++;
}
return right-left;
}
}