题目描述
输入一个正数 s,打印出所有和为 s 的连续正数序列(至少含有两个数)。
基本思路
由于是连续数字序列,那么我们只需要知道序列的头和为就知道序列中所有的数字。基于这一点,考虑用 start 和 end 表示序列的头和尾。此时通过以下方式移动两个指针:
- 将 start 初始化为1,end 初始化为 2,curSum 初始化为3;
- 当 curSum 小于 s 时,end 向前移动一位,然后 curSum = curSum + end;
- 当 curSum 大于 s 时,curSum = curSum - start,然后 start 向前移动一位;
- 当 curSum 等于 s 时,保存序列,然后 end 向前并更新 curSum。
注意:不需要搜索到 end == s,当 end 大于中间值之后,就已经不存在合适的序列了。
具体解答如下:
public ArrayList<ArrayList<Integer> > FindContinuousSequence(int sum) {
ArrayList<ArrayList<Integer>> result = new ArrayList<>();
if (sum < 3) {
return result;
}
int start = 1;
int end = 2;
int mid = (1+sum) / 2;
int curSum = 3;
while (start < end && end <= mid) {
if (curSum == sum) {
ArrayList<Integer> list = new ArrayList<>();
for (int i = start; i <= end; i++) {
list.add(i);
}
result.add(list);
end++;
curSum = curSum + end;
} else if (curSum < sum) {
end++;
curSum = curSum + end;
} else {
curSum = curSum - start;
start++;
}
}
return result;
}