汇芳书院

专注计算机视觉、机器学习、分布式计算等领域, 兼聊投资、写作、生活

0%

NC125 和为K的连续最大子数组

NC125 和为K的连续最大子数组

给定一个无序数组 arr , 其中元素可正、可负、可0。给定一个整数 k ,求 arr 所有连续子数组中累加和为k的最长连续子数组长度。保证至少存在一个合法的连续子数组。
[1,2,3]的连续子数组有[1,2],[2,3],[1,2,3] ,但是[1,3]不是

要求:空间复杂度 O(n), 时间复杂度 O(n)

示例1
输入:
[1,-2,1,1,1],0
返回值:
3

示例2
输入:
[0,1,2,3],3
返回值:
3


前缀和+哈希表

哈希表记录前缀和第一次出现的位置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
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) {
// write code here
unordered_map<int, int> mp;
mp[0] = -1;
int pre = 0, ans = 0;
for (int i = 0; i < arr.size(); i++) {
pre += arr[i];
if (mp.find(pre-k) != mp.end()) {
ans = max(ans, i-mp[pre-k]);
}
if (mp.find(pre) == mp.end()) {
mp[pre] = i;
}
}
return ans;
}
};
坚持原创分享,您的支持将鼓励我继续创作

欢迎关注我的其它发布渠道

------------- 本文结束,感谢阅读 如有问题可留言交流 -------------