[程序员代码面试指南]数组和矩阵-未排序正数数组中累加和为给定值的最长子数组长度-2

题目描述

输入无序数组arr,元素可正可负可0,再给整数k,求arr所有子数组中累加和为k的最长子数组长度。

解题思路

三个变量:
sum为pos为0到i的所有元素的累加和;
len为当前满足题意的最长子数组长度;
map key为从arr最左边开始累加的过程中出现过的sum值,value表示sum值最早出现的位置,因为要求最长的。

遍历一遍,维护sum;len=>更新看在map中是否存在sum-k,因为sum-(sum-k)=k;map。

特别的,map初始化要先放入key=0 value=-1,否则因为sum(i)-sum(j)=arr[j+1,i]的累加和,以0开始的子数组将全部被忽略。

代码

public class Solution{
    public int getLongestStrLen(int arr[],int k) {
        int sum=0;
        int len=-1;
        HashMap<Integer,Integer> firstAccurMap=new HashMap<Integer,Integer>();
        firstAccurMap.put(0, -1);
        for(int i=0;i<arr.length;++i) {
            sum+=arr[i];
            if(firstAccurMap.containsKey(sum-k)) {
                int begPos=firstAccurMap.get(sum-k);
                if(i-begPos>len) {
                    len=i-begPos;//
                }
            }
            if(!firstAccurMap.containsKey(sum)) {
                firstAccurMap.put(sum, i);
            }
        }
        return len;
    }
}

猜你喜欢

转载自www.cnblogs.com/coding-gaga/p/10841728.html