滑动窗口
leetcode双周赛T3 5423 找两个和为目标值且不重叠的子数组 DP, 前缀和
int minSumOfLengths(vector<int>& arr, int target) {
int n = arr.size();
map<int,int>mp;
const int maxn = 0x3f3f3f3f;
vector<int> dp(n+1,maxn);
dp[0]=maxn;
mp[0]=0;
int ans=maxn;
int sum=0;
//dp[i],到i单解的最小长度
for(int i=1;i<=n;i++)
{
sum+=arr[i-1];//前缀和
mp[sum]=i;
if(mp.count(sum-target))//存在至少一个解target
{
int cur=i-mp[sum-target];//右侧长度
int bfind=mp[sum-target];//左侧
if(dp[bfind]<maxn)//左侧还能存在一个解
{
ans=min(ans,cur+dp[bfind]);//更新答案
}
dp[i]=min(dp[i-1],cur); //只要存在一个答案就要更新dp[i]
}
else
dp[i]=dp[i-1];//不存在答案就保留
}
return ans == maxn ? -1 : ans;
}