- 找两个和为目标值且不重叠的子数组
给你一个整数数组 arr 和一个整数值 target 。
请你在 arr 中找 两个互不重叠的子数组 且它们的和都等于 target 。可能会有多种方案,请你返回满足要求的两个子数组长度和的 最小值 。
请返回满足要求的最小长度和,如果无法找到这样的两个子数组,请返回 -1 。
我是废物
class Solution {
public:
int minSumOfLengths(vector<int>& arr, int target) {
unordered_map<int, int> fuck; // 记录前缀和出现的最后一个下标
int t = 0;
int ans = 2e9;
vector<int> m_f; // 记录到每个位置,和为target的最短子数组的长度
int mi = 0;
fuck[0] = -1;
for(int i = 0; i < arr.size(); i ++){
t += arr[i];
fuck[t] = i;
// cout << i << " ";
if(fuck.count(t - target)){
int l_i = fuck[t - target];
int ttt = i - l_i;
if(! mi) mi = ttt;
else mi = min(mi, ttt);
m_f.push_back(mi);
if(l_i != -1 && m_f[l_i] != 0) ans = min(ans, m_f[l_i] + ttt);
}else{
m_f.push_back(mi);
}
}
if(ans == 2e9) return -1;
else return ans;
}
};