[程序员代码面试指南]数组和矩阵-未排序数组中累加和为给定值的最长子数组长度
题目描述
输入无序数组arr,元素可正可负可0,再给整数k,求arr所有子数组中累加和为k的最长子数组长度。
解题思路
三个变量:
sum为pos为0到i的所有元素的累加和;
len为当前满足题意的最长子数组长度;
map key为从arr最左边开始累加的过程中出现过的sum值,value表示sum值最早出现的位置,因为要求最长的。
遍历一遍,维护sum;len=>更新看在map中是否存在sum-k,因为sum-(sum-k)=k;map。
特别的,map初始化要先放入key=0 value=-1,否则因为sum(i)-sum(j)=arr[j+1,i]的累加和,以0开始的子数组将全部被忽略。
代码
public class Solution{
public int getLongestStrLen(int arr[],int k) {
int sum=0;
int len=-1;
HashMap<Integer,Integer> firstAccurMap=new HashMap<Integer,Integer>();
firstAccurMap.put(0, -1);
for(int i=0;i<arr.length;++i) {
sum+=arr[i];
if(firstAccurMap.containsKey(sum-k)) {
int begPos=firstAccurMap.get(sum-k);
if(i-begPos>len) {
len=i-begPos;//
}
}
if(!firstAccurMap.containsKey(sum)) {
firstAccurMap.put(sum, i);
}
}
return len;
}
}
posted on 2019-05-09 23:31 coding_gaga 阅读(139) 评论(0) 编辑 收藏 举报
【推荐】还在用 ECharts 开发大屏?试试这款永久免费的开源 BI 工具!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步