题目描述
给定一个无序数组arr, 其中元素可正、可负、可0。给定一个整数k,求arr所有子数组中累加和为k的最长子数组长度
输入描述
第一行两个整数N, k。N表示数组长度,k的定义已在题目描述中给出 第二行N个整数表示数组内的数
输出描述
输出一个整数表示答案
代码实现
import java.util.*;
public class Main{
public static void main(String[] args){
Scanner sc=new Scanner(System.in);
int N=sc.nextInt();
int k=sc.nextInt();
int[] arr=new int[N];
for(int i=0;i<N;i++){
arr[i]=sc.nextInt();
}
HashMap<Integer,Integer> map=new HashMap<>();//key为累加和(从数组第一个元素开始进行累加),value为累加和第一次出现的数组下标
map.put(0,-1);
int sum=0;
int res=0;
for(int i=0;i<N;i++){
sum+=arr[i];
if(map.containsKey(sum-k)){//画个线段示意图就明白了
int start=map.get(sum-k);
int len=i-start;
res=Math.max(len,res);
}
if(!map.containsKey(sum)){//判断是否存在累加和为sum的元素
map.put(sum,i);
}
}
System.out.println(res);
}
}