题目描述:
给定一个数组 nums 和一个目标值 k,找到和等于 k 的最长子数组长度。如果不存在任意一个符合要求的子数组,则返回 0。
注意:
nums 数组的总和是一定在 32 位有符号整数范围之内的。
示例 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,且长度最长。
进阶:
你能使时间复杂度在 O(n) 内完成此题吗?
方法1:
主要思路:
(1)使用前缀和,然后以 k 作为间隔,去找前面是否出现过对应的和即可;
class Solution {
public:
int maxSubArrayLen(vector<int>& nums, int k) {
unordered_map<int,int> mp;
mp[0]=-1;//初始化
int sum_sub=0;//已遍历的元素的和
int max_len=0;//最大长度
for(int i=0;i<nums.size();++i){
sum_sub+=nums[i];//更新和
if(mp.count(sum_sub-k)){//对应的和是否存在,若存在,则更新可能的最长长度
max_len=max(max_len,i-mp[sum_sub-k]);
}
//当前和是否存在,若不存在,则添加,若存在,则跳过,因为之前添加的索引一定更小
if(!mp.count(sum_sub)){
mp[sum_sub]=i;
}
}
return max_len;
}
};