主要思想:用small和big分别表示序列的最小值和最大值,首先将small初始化为1,big初始化为2,如果从small到big的序列的和大于s,从序列中去掉较小的值,也就是增大small的值,序列数少1.如果从small到big的序列和小于s,增大big,序列数加1。small一直增加到(1+s)/2为止。
package com.example.interview41_2;
import java.util.ArrayList;
public class Solution {
public ArrayList<ArrayList<Integer>> FindContinuousSequence(int sum) {
ArrayList<ArrayList<Integer>> arrayList = new ArrayList<ArrayList<Integer>>();
if (sum < 3) {
return arrayList;
}
int small = 1;
int big = 2;
//用于存放连续正数序列的和
int s = 0;
//small到big之共有多少个连续的正数
int length = big - small + 1;
int middle = (1 + sum) / 2;
//循环的条件是
while (small < middle && small < big) {
s = 0;
//对连续正数序列求和
for (int i = small ; i <= big; i++) {
s += i;
}
if (s == sum) {
ArrayList<Integer> subArrayList = new ArrayList<Integer>();
//将符合条件的该序列放入集合中
for (int i = small ; i <= big; i++){
subArrayList.add(i);
}
arrayList.add(subArrayList);
small++;
} else if (s < sum) {
//如果当前序列的和小于s,则增大big,即多增加一个数,small维持不变
//xxx-->xxxx
big++;
} else {
//如果当前序列的和大于s,则增大small,即small右移一位,减少了数的个数,big维持不变
//xxxx-->xxx
small++;
}
}
return arrayList;
}
}