题目描述:
给你一个整数数组 arr 和一个整数值 target 。
请你在 arr 中找 两个互不重叠的子数组 且它们的和都等于 target 。可能会有多种方案,请你返回满足要求的两个子数组长度和的 最小值 。
请返回满足要求的最小长度和,如果无法找到这样的两个子数组,请返回 -1 。
思路:
滑动窗口+动态规划
滑动窗口用来求和为目标值的子数组
动态规划用来求存放子数组的长度
代码如下:
class Solution {
public:
int minSumOfLengths(vector<int>& arr, int target) {
vector<int>len(arr.size()+1,200001);
int sum=0;
int res=200001;
int r=arr.size()-1;
for(int l=arr.size()-1;l>=0;l--){
sum+=arr[l];
while(sum>target){
sum-=arr[r];
r--;
}
if(sum==target){
int cur=r-l+1;
res=min(res,cur+len[r+1]);//len[r+1]确保不重叠,滑动窗口的最右边的索引r,r的再右边(后边)一定不会重叠
len[l]=min(cur,len[l+1]);//保存后面的最小的长度
}
else
len[l]=len[l+1];
}
return res==200001?-1:res;
}
};