public class Solution {
    /**
     * max length of the subarray sum = k
     * @param arr int整型一维数组 the array
     * @param k int整型 target
     * @return int整型
     */
    public int maxlenEqualK (int[] arr, int k) {
        // write code here
        int len = arr.length;
        if(arr == null || len == 0){
            return 0;
        }
        // key 从0加到i的sum和, 减k可能是负数,value值表示sum值最早出现的位置,
        //因为有正有负
        Map<Integer, Integer> map = new HashMap<Integer,Integer>();
        //sum-k存在,从map中取出sum-k对应的value,记为j,
        //得到s(i)-s(j)=k,所以此时arr[j+1, i]的长度即为题目要求的子数组的长度
        //包含j+1. 这样j+1 >= 1 如果不考虑0位置元素
        map.put(0,-1);
        int length = 0;
        int sum = 0;
        for(int i = 0;i< arr.length;i++){
            sum += arr[i];
            // sum 减去 sum -k == k ,所以看一下sum -k 位置的数有没有记录
            //有的话,取最大的连续子数组长度 长度就是 sum位置 i 减去 sum -k 位置的index 
            if(map.containsKey(sum - k)){
                length = Math.max(i - map.get(sum - k), length);
            }
            if(!map.containsKey(sum)){
                map.put(sum, i);
            }
        }
        return length;
    }
}