剑指offer系列之41:和为s的连续整数序列

来源:互联网 发布:sql什么意思 编辑:程序博客网 时间:2024/05/22 01:52

题目描述:输入一个整数s,输出所有的和为s的连续整数序列。

思路:该题和“和为s的两个整数”思路一样,考虑用两个数small和big来表示序列的最小值和最大值,首先把small初始化为1,big初始化为2,如果从small到big的序列的和大于s,可以从序列中去掉较小的值,把small加1,如果从small到big的序列的和小于s,增大big使序列包含更多的元素。因为序列中至少要含有两个数字,可以一直增加到small等于(1+s)/2为止。

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 curSum = small+big;        ArrayList<Integer> list = null;        while(small < middle){            if(curSum == sum){                list = new ArrayList<Integer>();                for(int i = small;i <= big;i++){                    list.add(i);                }                result.add(list);            }            while(curSum > sum && small < middle){                curSum = curSum - small;                small++;                if(curSum == sum){                    list = new ArrayList<Integer>();                    for(int i = small;i <= big;i++){                        list.add(i);                    }                    result.add(list);                }            }            big++;            curSum = curSum + big;        }        return result;    }}
0 0