剑指offer:和为s的连续正数序列(java)

/**
 * 题目:
 *      小明很喜欢数学,有一天他在做数学作业时,要求计算出9~16的和,他马上就写出了正确答案是100。
 *      但是他并不满足于此,他在想究竟有多少种连续的正数序列的和为100(至少包括两个数)。
 *      没多久,他就得到另一组连续正数和为100的序列:18,19,20,21,22。现在把问题交给你,你能不能也很快的找出所有和为S的连续正数序列? Good Luck!
 */

import java.util.ArrayList;

public class P282_FindContinuousSequence {
    public ArrayList<ArrayList<Integer>> FindContinuousSequence(int sum){

        ArrayList<ArrayList<Integer>> result = new ArrayList<>();

        //因为至少要包括两个数,要求的是正整数序列,那么最小的和为3
        if (sum < 3) {
            return result;
        }

        //用来记录正整数序列中最小的数
        int small = 1;

        //用来记录正整数序列中最大的数
        int big = 2;

        //当前序列总和
        int curSum = small + big;

        //序列之和为sum的数至少包括两个数,所以small<mid
        int mid = (sum + 1) / 2;

        while (small < mid) {

            //当前的序列和大于sum
            while(curSum > sum && small < mid)
            {
                curSum = curSum-small;
                small++;
            }

            //当前序列和为sum了,则将这些数加入到list中
            if (curSum == sum) {
                ArrayList<Integer> temp = new ArrayList<>();
                temp = add(temp, small, big);
                result.add(temp);
            }

            //当前的序列和小于sum
                big++;
                curSum = curSum + big;
        }
        return result;
    }

    public ArrayList<Integer> add(ArrayList<Integer> temp, int small, int big) {
        for (int i = small; i <= big; i++) {
            temp.add(i);
        }
        return temp;
    }

    public static void main(String[] args) {
        int sum = 15;

        P282_FindContinuousSequence test = new P282_FindContinuousSequence();
        ArrayList<ArrayList<Integer>> result = test.FindContinuousSequence(sum);
        System.out.println(result);
    }
}

猜你喜欢

转载自blog.csdn.net/Sunshine_liang1/article/details/82874387