剑指offer-41-2.和为S的连续正数序列

https://www.nowcoder.com/practice/c451a3fd84b64cb19485dad758a55ebe?tpId=13&tqId=11194&tPage=3&rp=1&ru=%2Fta%2Fcoding-interviews&qru=%2Fta%2Fcoding-interviews%2Fquestion-ranking

题目描述
输入一个正数s,打印出所有和为 s 的连续正数序列(至少含有两个数)。例如 输入15,由于 1+2+3+4+5=4+5+6=7+8=15,所以结果打印出3个连续序列 1~5、4~6 和 7~8。

输出描述:
输出所有和为S的连续正数序列。序列内按照从小至大的顺序,序列间按照开始数字从小到大的顺序

题解:

用两个数 small 和 big 分别表示序列的最小值和最大值。初始化 small=1,big=2,依次增大big的值,如果等于 sum,输出,如果大于sum, 增大small的值,使currentSum减小。
因为序列至少有两个数字,small 只能到 (1 + sum) / 2 为止,不然再加上他前面的big一定大于sum。

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 currentSum = small + big;

        while (small < middle) {
            if (currentSum == sum) {
                result.add(printCurrentSequence(small, big));
            }
            while (currentSum > sum && small < middle) {
                currentSum -= small;
                small++;
                if (currentSum == sum) {
                    result.add(printCurrentSequence(small, big));
                }
            }
            big++;
            currentSum += big;
        }
        return result;
    }

    private ArrayList<Integer> printCurrentSequence(int small, int big) {
        ArrayList<Integer> sequence = new ArrayList<>();
        for (int i = small; i <= big; i++) {
            sequence.add(i);
        }
        return sequence;
    }
}

猜你喜欢

转载自blog.csdn.net/zxm1306192988/article/details/81811028
今日推荐