最长子数组长度问题
2019-02-28 本文已影响0人
柴崎越
一,简单
1.1题目

1,2解法
两个指针变量left和right,相当于是滑动窗体,根据sum(累加和)来判断是left移动还是right移动,k为目标值
1,如果sum==k,这是记录下数组的长度(len变量表示),在right之后的结尾的子数组一定大于当前的sum,所有left+1,开始考察left以后的子数组,同时把left对应的值(arr[left])除去.
2,如果sum>k,说明加上以right结束的子数组大了,查考left+1的子数组
3,如果sum<k,则right继续移动,同时需要判断,是否有溢出的危险

1.3代码实现
public static int getMaxLength(int[] arr,int k)
{
if(arr==null||arr.length==0 || k<=0)
{
return 0;
}
int L=0;
int R=0;
int sum=arr[0];
int len=0;
while(R<arr.length)
{
if(sum==k)//等于的话,锁,并记录
{
len=Math.max(len,R-L+1);
sum-=arr[L++];
}
else if(sum<k)//小于的话,继续扩,但是有越界的风险
{
R++;
if(R==arr.length)
{
break;
}
}
else //大于的话,缩
{
sum-=arr[L++];
}
}
return len;
}
二,中等
2.1题目

2.2分析
sum[j...i]=sum[i]-sumj

需要记录s(j)的的值和位置,我们定义一个hashmap,key存加到当前的sum值(0到当前下标),value存其下标

通过图可以知道我们key记录值,value记录出现这个值的最早的index

注:边界问题

2.3 代码实现
public static int maxLength(int[] arr, int k) {
if (arr == null || arr.length == 0) {
return 0;
}
HashMap<Integer, Integer> map = new HashMap<Integer, Integer>();
map.put(0, -1); // important
int len = 0;
int sum = 0;
for (int i = 0; i < arr.length; i++) {
sum += arr[i];
if (map.containsKey(sum - k)) {
len = Math.max(i - map.get(sum - k), len);
}
if (!map.containsKey(sum)) {
map.put(sum, i);
}
}
return len;
}