滑动窗口,dp, 前缀和

滑动窗口
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;
        }

你可能感兴趣的:(acm)