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

题目描述:输入一个整数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;
    }

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值