绝对差不超过限制的最长连续子数组

题目

1438. 绝对差不超过限制的最长连续子数组

解题思路

基本思路来自:我写了首诗,把滑动窗口算法算法变成了默写题,具体判断方法与官解类似。

  1. 对窗口内([left,right))元素分别建立一个最小单调队列和最大单调队列储存窗口索引;
  2. 每次循环先将right右移一位,后将窗口最右端元素right-1入队,如果队头元素在窗口外,则将队头元素出队;
  3. 如果窗口内最值的差距不满足要求,则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;
    }

}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值