该方法 的统一解法为:
计算每个位置结尾的情况下所求出的答案,然后总的答案必在其中。
#include<iostream>
#include<unordered_map>
#include<algorithm>
using namespace std;
int getMaxLen(int arr[], int aim, int length){
if(length == 0)
return 0;
unordered_map<int,int> map;
map[0] = -1;
// map.insert(make_pair(0,-1));
int sum =0;
int len =0;
for(int i=0;i<length;i++){
sum += arr[i];
//如果 当前位置的值能累加出 aim ,则 看 是否更新 len
if(map.find(sum-aim) != map.end()){
len = max(i - map.find(sum-aim)->second, len);
}
//如果 map中还没有出现过 sum, 则把 sum - poi 放入map中
if(map.find(sum) == map.end()){
map[sum] = i;
}
}
return len;
}
int main(){
int n,aim;
cin >> n >> aim;
int* arr = new int[n];
for(int i=0;i<n;i++){
cin >> arr[i];
}
cout << getMaxLen(arr, aim, n);
return 0;
}
引申问题:
求一 数组中,奇数和偶数相同的最大长度, 把奇数改为1 ,偶数改为-1.aim设为0,套用。
3万+



被折叠的 条评论
为什么被折叠?



