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

和为s的连续正数序列

题目 小明很喜欢数学,有一天他在做数学作业时,要求计算出9~16的和,他马上就写出了正确答案是100。但是他并不满足于此,他在想究竟有多少种连续的正数序列的和为100(至少包括两个数)。没多久,他就得到另一组连续正数和为100的序列:18,19,20,21,22。现在把问题交给你,你能不能也很快的找出所有和为S的连续正数序列?
输出描述 输出所有和为S的连续正数序列。序列内按照从小至大的顺序,序列间按照开始数字从小到大的顺序。
初步思路 划定范围首先1~s/2,后来想着根据奇偶数划分,但是这样似乎太狭隘。再后来感觉和等差求和有点相似,所以就有下面几个限定条件:① s=na1+n(n-1)/2;② a1<=s/2; ③ a1>0;④ n>=2;根据以上四个条件进行查找;采用插入排序将其进行序间排序
自己写的low代码

import java.util.ArrayList;
public class Solution {
    public ArrayList<ArrayList<Integer> > FindContinuousSequence(int s) {
    /*      ArrayList<ArrayList<Integer>> list = new ArrayList();
        if (s <= 0) {
            return list;
        }
        int a1 = 0;
        int n = 2;

        for (;; n++) {
            a1 = s / n + (1 - n) / 2;
            if (a1 <= 0 || a1 > s / 2) {
                break;
            }
            int sum = n*a1+n*(n-1)/2;
            if(sum==s) {
                ArrayList<Integer> list1= new ArrayList();
                for(int i=0;i<n;i++) {
                    list1.add(a1+i);
                }
                list.add(list1);
            }

        }
        return list;*/
        //上面这种不符合序列建按照开始数字从小到大的顺序;
        ArrayList<ArrayList<Integer>> list = new ArrayList();
        if (s <= 0) {
            return list;
        }
        int a1 = 0;
        int n = 2;

        for (;; n++) {
            a1 = s / n + (1 - n) / 2;
            if (a1 <= 0 || a1 > s / 2) {
                break;
            }
            int sum = n * a1 + n * (n - 1) / 2;

            if (sum == s) {
                ArrayList<Integer> list1 = new ArrayList();
                for (int i = 0; i < n; i++) {
                    list1.add(a1 + i);
                }
                for (int i = 0; i < list.size(); i++) {
                    if (list1.get(0) < list.get(i).get(0)) {
                        list.add(new ArrayList()); //需要添加一个新的元素;
                        for (int j = list.size()-1; j > i; j--) {
                            list.set(j, list.get(j - 1));
                        }
                        list.set(i, list1);
                        break;

                    }
                }
                if(!list.contains(list1)) {
                    list.add(list1);
                }
            }

        }
        return list;
    }
}

猜你喜欢

转载自www.cnblogs.com/LynnMin/p/9334660.html