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;
	}
相关推荐
(Charon)31 分钟前
【C++】锁与原子操作(四):自旋锁的完整实现与性能优化
c语言·开发语言·c++
evans在进步1 小时前
Spring AI 从入门到实战:用 Java 实现大模型对话与 Tool Calling
java·人工智能·spring
evans在进步1 小时前
LeetCode 189 轮转数组:三次反转原地解决,图解 Java 实现
java·算法·leetcode
bu_shuo2 小时前
MATLAB中的meshgrid和ndgrid
开发语言·matlab
我命由我123452 小时前
Jetpack Compose - MaterialExpressiveTheme 与 MaterialTheme、ColorScheme
android·java·开发语言·java-ee·kotlin·android jetpack·android runtime
晚安code2 小时前
Java 异常与日志规范:错误码、异常处理、日志规约一次讲清
java
深海呐3 小时前
仓颉语言是ArkTs的上层语言吗?就像kotlin和Java
java·开发语言·kotlin·仓颉
隔窗听雨眠3 小时前
OceanBase旁路导入与自增主键冲突深度解析:原理、排查与解决方案
java·服务器·数据库
熬夜苦读学习3 小时前
Qt--界面优化
开发语言·qt
白露与泡影3 小时前
聊聊物联网Java后端的核心技术难点(水表/电表/充电桩实战)
java·开发语言·物联网