题目描述
输入一个正数s,打印出所有和为 s 的连续正数序列(至少含有两个数)。例如 输入15,由于 1+2+3+4+5=4+5+6=7+8=15,所以结果打印出3个连续序列 1~5、4~6 和 7~8。
输出描述:
输出所有和为S的连续正数序列。序列内按照从小至大的顺序,序列间按照开始数字从小到大的顺序
题解:
用两个数 small 和 big 分别表示序列的最小值和最大值。初始化 small=1,big=2,依次增大big的值,如果等于 sum,输出,如果大于sum, 增大small的值,使currentSum减小。
因为序列至少有两个数字,small 只能到 (1 + sum) / 2 为止,不然再加上他前面的big一定大于sum。
import java.util.ArrayList;
public class Solution {
public ArrayList<ArrayList<Integer>> FindContinuousSequence(int sum) {
ArrayList<ArrayList<Integer>> result = new ArrayList<ArrayList<Integer>>();
if (sum < 3) {
return result;
}
int small = 1;
int big = 2;
int middle = (1 + sum) / 2;
int currentSum = small + big;
while (small < middle) {
if (currentSum == sum) {
result.add(printCurrentSequence(small, big));
}
while (currentSum > sum && small < middle) {
currentSum -= small;
small++;
if (currentSum == sum) {
result.add(printCurrentSequence(small, big));
}
}
big++;
currentSum += big;
}
return result;
}
private ArrayList<Integer> printCurrentSequence(int small, int big) {
ArrayList<Integer> sequence = new ArrayList<>();
for (int i = small; i <= big; i++) {
sequence.add(i);
}
return sequence;
}
}