Q:一个数组中和为K的最长子数组
A:关键在于递推关系 sum[j]=sum[i]+K,这样arr[i+1]到arr[j]的和就为K。
import java.util.*;
public class 一个数组中和为指定值的最长子数组
{
public static int getMaxLen(int[] arr,int k)
{
int len=0;
int sum=0;
HashMap<Integer,Integer> map=new HashMap<>();
map.put(0,-1);
for (int i=0;i<arr.length ;i++ )
{
sum+=arr[i];
if (map.containsKey(sum-k))
{
len=Math.max(len,i-map.get(sum-k));
}
if (!map.containsKey(sum))
{
map.put(sum,i);
}
}
return len;
}
}
类似的问题有很多,比如
Q:求和为K的倍数的最长子数组长度
A:如果sum[j]%K=sum[i]%K,这样arr[i+1]到arr[j]的和就为K的倍数。