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

题目分析

如果一个子数组达标,也就是它内部的最大值减去最小值小于等于给定限制limit, 则其内部任意小范围一定也达标,因为范围变小,最大值只可能变小或者不变,而最小值只可能变大或者不变。

如果一个子数组不达标,则再扩大范围一定会更加不达标,因为范围变大,最大值只可能上升或者不变,而最小值只可能下降或者不变。

先固定左边界l,右边界r不断右移扩展窗口,每次判断新加入的数是否使窗口达标,如果达标,则继续拓展,不达标则停止,计算以当前l开头的达标子数组的最大长度。

求解代码

java 复制代码
	public static int MAXN = 100001;

	public static int[] maxDeque = new int[MAXN];
	public static int[] minDeque = new int[MAXN];

	public static int maxh,maxt,minh,mint;
	public static int[] arr;
	public static int longestSubarray(int[] nums,int limit){
		maxh = maxt = minh = mint = 0;
		arr = nums;
		int n = arr.length;
		int ans = 0;
		for(int l=0,r=0;l<n;l++){
			while(r<n&&ok(limit,nums[r])){
				push(r++);
			}
			ans = Math.max(ans, r-l);
			pop(l);
		}
		return ans;
	}

	public static boolean ok(int limit,int number){
		int max = maxh <maxt?Math.max(arr[maxDeque[maxh]], number):number;
		int min = minh <mint?Math.min(arr[minDeque[minh]], number):number;
		return max-min<=limit;
	}

	public static void push(int r){
		while (maxh<maxt&&arr[maxDeque[maxt-1]]<=arr[r]) {
			maxt--;
		}
		maxDeque[maxt++]=r;
		while (minh<mint&&arr[minDeque[mint-1]]>=arr[r]) {
			mint--;
		}
		minDeque[mint++]=r;
	}

	public static void pop(int l) {
		if (maxh < maxt && maxDeque[maxh] == l) {
			maxh++;
		}
		if (minh < mint && minDeque[minh] == l) {
			minh++;
		}
	}	
相关推荐
皓月盈江几秒前
Go读写TXT文件
开发语言·后端·golang·go·读写txt文件·bufio·go读写txt
老歌老听老掉牙2 分钟前
两个平面旋转平移坐标系间的坐标变换关系
python·算法·平面·旋转·平移
qq_401700415 分钟前
Qt Signal Mapper:一堆按钮,怎么共用一个槽函数
开发语言·qt
W.A委员会5 分钟前
PID与PID整定
python·算法
省钱兄--zs12 分钟前
24小时自助健身房系统软件开发实战:从架构设计到部署全指南
java·数据仓库·spring boot·系统架构·需求分析
IT研究室16 分钟前
最新计算机毕业设计选题推荐-基于spring boot的智慧教学资源管理与互动交流平台-网站-文档指导-Java-springboot
java·spring boot·课程设计
蜗牛互联网18 分钟前
Java HttpClient 调用 Gemini 图像理解与金额字段校验
java·开发语言·人工智能·后端·python
开开心心就好18 分钟前
视频里的图片怎么提取?双击一下就导出
java·前端·人工智能·spring·智能手机·intellij-idea·excel
蜗牛互联网19 分钟前
Python Responses API视觉输入与本地金额校验最小实现
java·开发语言·人工智能·后端·python
冷雨夜中漫步20 分钟前
YOLO快速入门——(2)YOLO V26安装与快速入门
图像处理·算法·yolo·计算机视觉