题目一:
输入一个正整数s,打印出所有和为s的连续正整数序列(至少有两个数)。
两个下标small和big,可以看出small递增到s/2即可。
import java.util.ArrayList;
public class Solution {
public ArrayList<ArrayList<Integer> > FindContinuousSequence(int sum) {
ArrayList<ArrayList<Integer> > array=new ArrayList();
if(sum < 3)
return array;
int small=1;
int big=2;
int mid=sum/2;
int cursum=3;
while(small <= mid)
{
if(cursum == sum)
{
ArrayList<Integer> list=new ArrayList();
for(int i=small;i<=big;i++)
{
list.add(i);
}
array.add(list);
cursum-=small;
small++;
}else if(cursum < sum)
{
big++;
cursum+=big;
}else
{
cursum-=small;
small++;
}
}
return array;
}
}
题目二:
给定一个无序正数数组和一个数s,求所有子数组中累加和为s的最长子数组长度。
例如,arr={1,2,1,1,1}, k=3; 结果返回3。
public int getMaxLength(int[] array,int k)
{
if(array == null||array.length == 0)
return 0;
int small=0;
int big=0;
int sum=array[0];
int len=0;
while(big<array.length)
{
if(sum == k)
{
len=Math.max(len, big-small+1);
sum-=small;
small++;
}else if(sum < k)
{
big++;
if(big == array.length)//下标一旦更改就要防止越界。
break;
sum+=array[big];
}else
{
sum-=small;
small++;
}
}
return len;
}