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