首先通过前缀和数组将区间和转化为数组两元素之差 map用来存储前缀和数组不同元素第一次出现的下标(和为K的最长子数组) 倒序遍历前缀和数组找到符合条件的元素和当前元素的距离即为最大距离

/**
 * max length of the subarray sum = k
 * @param arr int整型一维数组 the array
 * @param k int整型 target
 * @return int整型
 */
function maxlenEqualK( arr ,  k ) {
    // write code here
    // 前缀和数组
    let preArr = [];
    let preMap = new Map();
    preMap.set(0, 0);
    preArr[0] = 0;
    for (let i = 0; i < arr.length; i++) {
        preArr[i + 1] = preArr[i] + arr[i];
        //记录第一次出现的位置
        if (preMap.has(preArr[i + 1]) != true) {
            preMap.set(preArr[i + 1], i + 1);
        }
    }
    
    let subArrLen = 0;
    for (let i = arr.length; i >= 0; i--) {
        let target = preArr[i] - k;
        if (preMap.has(target) == true) {
            subArrLen = Math.max(subArrLen, i - preMap.get(target));
        }
    }
    
    return subArrLen;

}
module.exports = {
    maxlenEqualK : maxlenEqualK
};