剑指offer 和为s的连续正数序列

题目:输入一个正数s,打印出所有和为s的连续正数序列(至少含有两个数)。

思想是:先把left初始化为1,right初始化为2,如果从left到right的序列和大于s,我们可以去掉较小的值,也就是增大left的值,如果小于s,可以增大right的值,让这个序列包含更多的数字,因为这个序列至少要有两个数字,我们一直增加到left到(1+s)/2;

import java.util.ArrayList;
public class Solution {
    public ArrayList<ArrayList<Integer> > FindContinuousSequence(int sum) {
         ArrayList<ArrayList<Integer>> list=new ArrayList<ArrayList<Integer>>();
                
        int left=1;int right=2;
        if(sum<3)return list;
        int curSum=left+right;
        while(left<(sum+1)/2){
            if(curSum==sum)
                {
                ArrayList<Integer> ls=new ArrayList<Integer>();
               for(int i=left;i<=right;i++)
                ls.add(i);
                list.add(ls);
            }
            while(curSum>sum&&left<(sum+1)/2){
                curSum-=left;
                left++;
                if(curSum==sum){
               ArrayList<Integer> ls=new ArrayList<Integer>();
               for(int i=left;i<=right;i++)
                ls.add(i);
                list.add(ls);
                }
                    
            }
            right++;
            curSum+=right;
                
        }
        return list;
    }
    
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值