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; // } };