该方法 的统一解法为:
计算每个位置结尾的情况下所求出的答案,然后总的答案必在其中。
#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,套用。
本文介绍了一种求解数组中具有特定累加值的最大连续子数组长度的算法实现。通过使用哈希表记录前缀和的位置信息,该算法能够在O(n)的时间复杂度内找到目标子数组,适用于多种应用场景。

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



