如题,维护两个不定窗口之和为target,然后必须保证两个子数组长度最小和
思路:维护左,枚举右,前缀状态记录
java
class Solution {
public int minSumOfLengths(int[] arr, int target) {
int n=arr.length;
int[] best=new int[n];
int INF=Integer.MAX_VALUE/2;
int ans=INF;
int sum=0;
int left=0;
int bestSoFar=INF;//初始化
//枚举右端点
for(int right=0;right<n;right++){
sum+=arr[right];
while(sum>target){
sum-=arr[left];
left++;
}
//维护左,best[j]表示在区间 [0..j] 内(子数组右端点 ≤ j),和为 target 的子数组的最小长度
if(sum==target){
int len=right-left+1;
if(left>0&&best[left-1]!=INF){
ans=Math.min(ans,best[left-1]+len);
}
bestSoFar=Math.min(bestSoFar,len);
}
best[right]=bestSoFar;
}
return ans==INF?-1:ans;
}
}