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

题目描述

输入无序数组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;
	}
}

posted on 2019-05-09 23:31  coding_gaga  阅读(137)  评论(0编辑  收藏  举报

导航