给定一个数组 nums 和一个目标值 k,找到和等于 k 的最长连续子数组长度。如果不存在任意一个符合要求的子数组,则返回 0。
示例 1:
输入: nums = [1,-1,5,-2,3], k = 3
输出: 4
解释: 子数组 [1, -1, 5, -2] 和等于 3,且长度最长。
示例 2:
输入: nums = [-2,-1,2,1], k = 1
输出: 2
解释: 子数组 [-1, 2] 和等于 1,且长度最长。
提示:
1 <= nums.length <= 2 * 105
-104 <= nums[i] <= 104
-109 <= k <= 109
前缀和+map
class Solution {
public:
int maxSubArrayLen(vector<int>& nums, int k) {
int len=0;
unordered_map<int,int> m;
long sum=0;//开long防止溢出 sum用于记录前缀和
m.insert({0,-1});
for(int i=0;i<nums.size();i++){
sum+=nums[i];
if(!m.count(sum)){
//记录未出现过的前缀和 如果出现了 在后续计算区间长度(b-a)的时候最先出现的a具有最大区间长度
m.insert({sum,i});
}
if(m.count(sum-k)){
//出现满足条件的区间 判断是否更新最大长度
int tmp=i-m.find(sum-k)->second;
len<tmp?len=tmp:len;
}
}
return len;
}
};