题目描述
给定一个无序数组arr, 其中元素可正、可负、可0。给定一个整数k,求arr所有子数组中累加和为k的最长子数组长度
输入描述:
第一行两个整数N, k。N表示数组长度,k的定义已在题目描述中给出
第二行N个整数表示数组内的数
输出描述:
输出一个整数表示答案
示例1
输入
5 0
1 -2 1 1 1
输出
3
解法一:利用map前减后
import java.io.*;
import java.util.*;
public class Main{
public static void main(String[] args) throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String[] s1 = br.readLine().trim().split(" ");
String[] s2 = br.readLine().trim().split(" ");
int len = Integer.parseInt(s1[0]);
int sum = Integer.parseInt(s1[1]);
int[] arr = new int[len];
for(int i=0;i<len;i++){
arr[i] = Integer.parseInt(s2[i]);
}
int res = func(arr,sum);
System.out.println(res);
}
public static int func(int[] arr,int k){
if(arr==null||arr.length==0) return 0;
HashMap<Integer,Integer> map = new HashMap<>();
map.put(0,-1);
int sum = 0;
int res = 0;
for(int i=0;i<arr.length;i++){
sum += arr[i];
int tmp = sum-k;
if(map.containsKey(tmp)){
res = Math.max(i-map.get(tmp),res);
}
if(!map.containsKey(sum)){
map.put(sum,i);
}
}
return res;
}
}