思路
有了数组中和为定值的两个数字
的经验,我们也考虑用两个数small
和big
分别表示序列的最小值和最大值。首先把small初始化为1,big初始化为2.如果从small到big的序列的和大于s,我们可以从序列中去掉较小的值,也就是增大small的值。如果从small到big的序列的和小于s,我们可以增大big,让这个序列包含更多的数字。因为这个序列至少要有两个数字,我们一直增加small 到(1+s)/2
为止。
package com.zhumq.leetcode;
import org.junit.Test;
public class FindSumSequence {
/*
* small和big分别表示序列的最小值和最大值。
* 首先把small初始化为1,big初始化为2.
* 如果从small到big的序列的和大于s,我们可以从序列中去掉原来最小的值small,即small++。
* 如果从small到big的序列的和小于s,我们可以再加入一个数,让序列包含更多的数字,即big++。
* 因为这个序列至少要有两个数字,我们一直增加small到(1+s)/2为止。
*/
/*
找到和为s的连续正数序列
*/
public void findSumSequence(int s){
int start = 1;
int end = 2;
//终止条件
int mid = (1+s)>>1;
int cursum = start + end;
while(start < mid){
if(cursum == s){
int i;
for(i=start;i<=end;i++){
System.out.print(i);
if(i == end) {
System.out.println();
}
else {
System.out.print(" ");
}
}
end++;
cursum += end;
}
else if(cursum < s)
{
//small到big的序列的和小于s,我们可以再加入一个数,让序列包含更多的数字,即big++。
end++;
cursum += end;
}
else
{
//small到big的序列的和大于s,我们可以从序列中去掉原来最小的值small,即small++
cursum -= start;
start++;
}
}
}
@Test
public void test1() {
findSumSequence(100);
}
}