累加和为 K 的最长子数组问题
累加和为 K 的最长子数组问题
作者:Grey
原文地址:
题目描述
给定一个整数组成的无序数组 arr,值可能正、可能负、可能0,给定一个整数值 K,找到 arr 的所有子数组里,哪个子数组的累加和等于 K,并且是长度最大的,返回其长度。
OJ 见:LintCode 911 · Maximum Size Subarray Sum Equals k
主要思路
使用哈希表,key 存累加和,value 存当前位置,所以,
map.put(sum,i)
表示0...i
的累加和是sum
。
有了这个哈希表,我们可以继续遍历数组,当遍历到i
位置的时候,我们可以得到当前的累加和是sum
,我们期待哈希表中是否存在sum - k
的记录,如果有,说明
i - map.get(sum - k)
就是一个可能的答案,示例图如下
我们每次来到一个i
位置,就要定位上图中m
的位置,即i - map.get(sum-k)
的值。
然后和全局答案进行比较,抓取最大长度即可。
代码见:
public class Solution {
public static int maxSubArrayLen(int[] arr, int k) {
if (arr == null) {
return 0;
}
Map<Integer, Integer> map = new HashMap<>();
map.put(0, -1);
int ans = 0;
int sum = 0;
for (int i = 0; i < arr.length; i++) {
sum += arr[i];
// 期待map里面有sum - k的记录
if (map.containsKey(sum - k)) {
ans = Math.max(ans, i - map.get(sum - k));
}
if (!map.containsKey(sum)) {
map.put(sum, i);
}
}
return ans;
}
}
注:map.put(0, -1);
这一句很有必要,表示在一个元素都没有的情况下,已经可以得到一个累加和为 0 的数组了。
整个算法的时间复杂度是O(N)
,空间复杂度O(N)
。
有了上述算法模型,面对这题: LeetCode 525. Contiguous Array
给定一个整数组成的无序数组 arr,值可能正、可能负、可能0,找到 arr 的所有子数组里,数组中 1 和 0 一样多的子数组最长的长度
只需要预处理一下原数组,遇到0变为-1,遇到1保持1,遇到其他变为0,接下来求子数组之和为0的最大子数组长度,复用上述算法模板即可。
代码如下
class Solution {
public static int findMaxLength(int[] arr) {
for (int i = 0; i < arr.length; i++) {
if (arr[i] == 0) {
arr[i] = -1;
}
}
// 转换为累加和等于K的最长子数组长度
Map<Integer, Integer> map = new HashMap<>(arr.length);
map.put(0, -1);
int ans = 0;
int sum = 0;
for (int i = 0; i < arr.length; i++) {
sum += arr[i];
if (map.containsKey(sum)) {
ans = Math.max(ans, i - map.get(sum));
}
if (!map.containsKey(sum)) {
map.put(sum, i);
}
}
return ans;
}
}
更多#
作者:GreyZeng
出处:https://www.cnblogs.com/greyzeng/p/16701589.html
版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。
你可以在这里自定义其他内容
本文来自博客园,作者:Grey Zeng,转载请注明原文链接:https://www.cnblogs.com/greyzeng/p/16701589.html
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY