Leetcode862和至少为K的最短子数组

题目分析

遍历数组,对于每个位置i,假设子数据必须以i作为右边界,求出往左延伸多短,能够让累加和大于等于K,最后从所有答案中选择最小值。

准备一个双端队列,要求从头到尾严格小到大。

当来到位置i,0~i范围的前缀和为x时,从头部依次考察,如果x减去队列头部指示的前缀和达标,则记录答案并将头部元素弹出,因为后续位置使用该前缀和得到的结果不会更短。

加入新的前缀和时,如果不满足队列小到大的顺序,则从尾部弹出元素。

求解代码

java 复制代码
public static int MAXN = 100001;
	public static long[] sum = new long[MAXN];
	public static int[] deque = new int[MAXN];
	public static int h,t;
	public static int shortestSubarray(int[] arr,int K){
		int n = arr.length;
		for(int i = 0;i<n;i++){
			sum[i+1]=sum[i]+arr[i];
		}
		h=t=0;
		int ans = Integer.MAX_VALUE;
		for(int i=0;i<=n;i++){
			while (h!=t&&sum[i]-sum[deque[h]]>=K) {
				ans = Math.min(ans, i-deque[h++]);
			}

			while (h!=t&&sum[deque[t-1]]>=sum[i]) {
				t--;
			}
			deque[t++]=i;
		}
		return ans!=Integer.MAX_VALUE?ans:-1;
	}
相关推荐
geovindu5 小时前
CSharp: Bridge Pattern
开发语言·后端·桥接模式·结构型模式
এ慕ོ冬℘゜5 小时前
深入 JavaScript BOM:掌握 window 对象的窗口控制魔法
开发语言·javascript·ecmascript
2501_941982055 小时前
企业微信二次开发:如何用 Python 搭建通用的 Webhook 实时消息接收
开发语言·python·企业微信
cfm_29145 小时前
Spring监听器
java·spring boot·后端
逝水无殇5 小时前
C# 特性详解
开发语言·后端·c#
SamDeepThinking6 小时前
Java面向对象在JVM里怎么实现
java·后端·面试
灵晔君6 小时前
【C++】二叉搜索树
开发语言·c++
LongtengGensSupreme6 小时前
C#图像内存高速拷贝:使用Marshal.AllocHGlobal与ArrayPool实现内存拷贝的几个方法
开发语言·数码相机·c#
Java面试题总结6 小时前
Python,单引号和双引号有何区别
开发语言·python
鱼子星_6 小时前
【C++】内存管理:内存分布,new/delete的使用及细节处理,new/delete的底层,定位new表达式
开发语言·c++·笔记