41和为S的连续正数序列

题目描述

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

思路分析

  • 暴力解法:直接两重循环
  • 双指针/滑动窗口:当前窗口的sum<规定值,右指针就走一格;sum=规定值,把窗口内的值加入list;sum>规定值,左指针就走一格。好思路!

代码实现

/**
 * 暴力解
 *
 * @param sum
 * @return
 */
public static ArrayList<ArrayList<Integer>> FindContinuousSequence1(int sum) {
    ArrayList<ArrayList<Integer>> arrayLists = new ArrayList<>();
    ArrayList<Integer> list = new ArrayList<>();
    int count = 0;
    for (int i = 1; i <= sum / 2; i++) {
        for (int j = i; j <= sum / 2 + 1; j++) {
            count += j;
            list.add(j);
            if (count == sum) {
                arrayLists.add(new ArrayList<>(list));
            } else if (count > sum) {
                break;
            }
        }
        count = 0;
        list.clear();
    }
    return arrayLists;
}

/**
 * 滑动窗口
 * @param sum
 * @return
 */
public static ArrayList<ArrayList<Integer>> FindContinuousSequence2(int sum) {
    ArrayList<ArrayList<Integer>> arrayLists = new ArrayList<>();

    int start = 1, end = 2;
    while (end > start) {
        //求和公式
        int cursum = (end + start) * (end - start + 1) / 2;
        //相等
        if (cursum == sum) {
            ArrayList<Integer> list = new ArrayList<>();
            for (int i = start; i <= end; i++) {
                list.add(i);
            }
            arrayLists.add(list);
            start++;
        } else if (cursum < sum) {
            //小了就扩大范围
            end++;
        } else {
            //大了就缩小范围
            start++;
        }
    }
    return arrayLists;
}
发布了118 篇原创文章 · 获赞 8 · 访问量 3720

猜你喜欢

转载自blog.csdn.net/qq_34761012/article/details/104443780