题目描述:
输出所有和为S的连续正数序列。序列内按照从小至大的顺序,序列间按照开始数字从小到大的顺序
思路解析:
- 用一个代表最小值,另一个代表最大值,还有一个累加求和
- 最小值小于mid可以减少时间复杂度
- 如果总和小于目标和,那么就把最大值加1;如果总和大于目标和,那么就把最小值加1(后移)
- 如果相等,就加入ArrayList类型的listall,注意add就是循环。
代码:
import java.util.ArrayList;
public class Solution {
public ArrayList<ArrayList<Integer> > FindContinuousSequence(int sum) {
ArrayList<ArrayList<Integer>> listall = new ArrayList<ArrayList<Integer>>();
if(sum<3){
return listall;
}
int small=1;
int big = 2;
int mid = (sum+1)/2;
int cursum=small+big;
while(small<mid){
while(cursum>sum&&small<mid){
cursum = cursum-small;
small++;
}
if(cursum==sum){
ArrayList<Integer> listsum = new ArrayList<Integer>();
add(listsum,small,big);
listall.add(listsum);
}
big++;
cursum = cursum+big;
}
return listall;
}
private static void add(ArrayList<Integer> list,int small,int big){
for(int i=small;i<=big;i++){
list.add(i);
}
}
}