题目描述
输入无序数组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;
}
}