这里的子数组是连续的,给定一个数组arr和目标值k,求解数组中所有连续子数组之和等于k的最大长度的子数组的长度,时间复杂度是O(n)
public int maxLenSumToK_NoMap(int [] nums,int k){
int len = nums.length;
int [] sums = new int[len];
sums[0] = nums[0];
for(int i=1; i < len; i++){
sums[i] = sums[i-1]+nums[i]; //先从第一个往后累加
}
int max = Integer.MIN_VALUE;
for(int i = 0; i < len; i++){
for(int j = i; j < len; j++){
if(sums[j]-sums[i]==k) max = Math.max(max,j-i); //判断所有的子数组之和等不等于k,并记录最大长度子数组
}
}
}
public int maxLenSumToK_WithMap(int [] nums,int k){
int len = nums.length;
int [] sums = new int[len];
sums[0]=nums[0];
int max = Integer.MIN_VALUE;
for(int i = 1 ; i < len; i++){
sums[i] = sums[i-1]+nums[i];
}
Map<Integer,Integer> map = new HashMap<>(); //用map来保存累加值和下表索引之间的对应关系
for(int i = 0; i < len; i++){
int dis = sums[i]-k;//求当前累加值和k之间的差距
int j = map.get(dis); //去map中查找有没有已经放入了这个期待的差距值,有的话拿到其索引值用于更新max值
if(j!=null) max = Math.max(max,j-i); //更新max
if(!map.get(sums[i])) map.put(sums[i],i); //如果没有该累加值则加入,如果有的话放入的是前面的因为这样可以max更大。
}
return max;
}