未排序数组中累加和为给定值的最长子数组长度

题目描述

给定一个无序数组arr, 其中元素可正、可负、可0。给定一个整数k,求arr所有子数组中累加和为k的最长子数组长度。

思路

参考:《程序员代码面试指南》
使用hash map,键是从子数组的元素之和,值是这个子数组的元素之和第一次在数组中出现的位置。(这里说的子数组下标都是从0开始,到某个位置结束)。
假设累加和的给定值为k,当前累加和为sum,那么就判断map中是否存在sum-k的键,如果存在,则说明对于当前位置之前的某个位置(假设为p),存在arr[0…p]的累加和为sum-k,而又有arr[0…当前位置]的累加和为sum,所以arr[p+1…当前位置]的累加和一定为k。

代码

import java.util.*;


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
        HashMap<Integer, Integer> map = new HashMap<>();
        //key:累加和 value:第一次出现该累加和的位置
        int sum = 0;
        map.put(0,-1);
        int res = 0;
        for(int i = 0 ; i<arr.length ; i++){
            sum += arr[i];
            if(map.containsKey(sum-k)){
                res = Math.max(res, i-map.get(sum-k));
            }
            if(!map.containsKey(sum)){
                map.put(sum, i);
            }
        }
        return res;
    }
}
已标记关键词 清除标记
相关推荐
©️2020 CSDN 皮肤主题: 1024 设计师:白松林 返回首页