#include <unordered_map>
class Solution {
/*
一个数组存每位的前缀和,转换成两个数只差等于目标数,一个哈希表记录前缀和最先出现的位置,
从后向前遍历前缀和数组,查找哈希表中的前缀和,维护最大长度即可
*/
public:
int maxlenEqualK(vector<int>& arr, int k) {
if(arr.empty())return 0;
unordered_map<int , int> mp; //前缀和-下标
vector<int> preSum(arr.size()+1); //最后应该包括进去
preSum[0] = 0; //头一个下标
mp[0] = 0;
for(int i=1; i<preSum.size(); i++){
preSum[i] = arr[i-1] + preSum[i-1]; //初始化前缀数组,本位前缀不包括本位数;
if(mp.find(preSum[i]) == mp.end()){ //只更新最先出现的前缀和,没有则添加
mp[preSum[i]] = i;
}
}
int maxlen = 0;
for(int i=preSum.size()-1; i>=0; i--){
int partner = preSum[i] - k;
if(mp.find(partner) != mp.end()){ //如果找到了,则看是不是最大
maxlen = max(maxlen, i-mp[partner]);
}
}
return maxlen;
}
};