class Solution {
public:
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
* max length of the subarray sum = k
* @param arr int整型vector the array
* @param k int整型 target
* @return int整型
*/
int maxlenEqualK(vector<int>& arr, int k) {
unordered_map<int,int>dic;
vector<int> preSum(arr.size()+1, 0);
dic[preSum[0]] = 0;
//前缀和相同的只保存前面的索引值
for(int i = 1; i <= arr.size(); ++i){
preSum[i] = preSum[i-1]+arr[i-1];
if(dic.count(preSum[i])){
continue;
}
else{
dic[preSum[i]] = i;
}
}
int res = 0;
//从后往前遍历前缀和数组要查找的目标值target = preSum[i]-k
for(int i = arr.size();i >= 0; --i){
if(dic.count(preSum[i]-k)){
res = max(res, i - dic[preSum[i]-k]);
}
}
return res;
}
// int maxlenEqualK(vector<int>& arr, int k) {
// int res = 0;
// // dp[i]表示以i为结尾的累加和为k的连续子数组长度
// for(int i = 0; i < arr.size(); ++i){
// int sum = 0;
// for(int j = 0; j < arr.size(); ++j){
// sum += arr[j];
// if(sum == k){
// res = max(res, j-i+1);
// }
// }
// }
// return res;
// }
};